railsにおけるcreate,new,build,saveの使い方および誤りの要約

2863 ワード

自分はとても初級で、初級のは更に初級することができなくて、だから初めてrailsに接触する時、中のcreate、new、buildなどの方法に対してあまり理解していないで、使うのはとても混乱して、いつも不必要なbugが現れて、とても悩んで、決定して、総括して、ネット上のすでにソースがあって、深く理解して下でデータベースに記録を挿入する時よくnew、build、createを使います.この3つの方法はsaveを混同しやすい:railsのsaveは実はcreate_ですor_update、レコードの新規作成または変更!必ずしも新規ではありません.new:メモリにオブジェクトを新規作成するだけで、データベースを操作するにはsaveメソッドを呼び出します.create=new+はsqlを実行します.build:newとほぼ同じで、一対多の場合に多く使用されます.使用例を参照してください.new!, create!, build!new,create,buildとの違いは帯!のメソッドはvalidateを実行し、検証に失敗するとパイロットが放出されます.saveはインスタンスメソッドですが、create、build、newはモデルクラスのクラスメソッドです.もう一つの言い方もいいですね.次のようにまずnewを話しましょう.app=Appです.new(params[:app])、これは与えられたparamsでappオブジェクトをインスタンス化するもので、注意この場合はオブジェクトを初期化しただけで、rubyはメモリの中でappにメモリアドレスを割り当てただけで、このアドレスはまだ有効なメモリを指定していません.次にrubyがするのはmodelの中のinitialize関数を呼び出して与えられたパラメータに基づいてこのオブジェクトを初期化することです.オブジェクトをスタックに保存します.newに対して!つまり、これはnewと比較して、saveがデータベースに着いたときにsaveが失敗すると、エラーが報告されます.createの場合、プロセスはnewとほぼ差がありません.唯一の違いは、create=new+save、すなわちcreateのステップ操作がnewとsaveの2つの操作に等しいことです.createについて!と言えばnewに似ています!過程も大体newと!差が少ないのはcreate!=new! + save保存に失敗するとエラーが返されます.buildにとって、主な混同点はnewとの区別にあるが、実はbuildはnewの別名だと思うが、使う場所はnewと少し違うかもしれない.build()メソッドは、personに対応するordersを作成します.
次の簡単な例を示します.
 
 accepts_nested_attributes_for nested form

class User < ActiveRecord::Base

  attr_accessible :email, :account_attributes

  has_one :account

  accepts_nested_attributes_for :account

end





class Account < ActiveRecord::Base

  attr_accessible :password, :password_confirmation

  has_secure_password

  belongs_to :user 

end





class UsersController < ApplicationController

  def new

    @user = User.new

  end

end

 
viewで
 
<%= form_for @user do |f| %>

  email: <%= f.text_field :name %>

  <%= f.fields_for :account do |account_form| %>

    password: <%= account_form.password_field :password %>

    password_confirmation: <%= account_form.password_field :password_confirmation %>

  <% end %>

<% end %>

最初はaccountの内容を表示できませんでしたが、controllerでbuild accountがないことに気づき、
 
 
class UsersController < ApplicationController

  def new

    @user = User.new

    @user.account.build

  end

end

間違えてundefined method`build'for nil:NilClass最初はどうしても納得できなかったので、一日おきにひっくり返しましたhttp://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.htmlやっと気づいたhas_oneのbuildメソッドはbuild_collectionではなくassociationbuild.あまり使わないのでhas_one,railsの中で“約束”はまた比較的に多くて、やっとhasになりますmanyの方法で書きます.コントロールを
 
 
class UsersController < ApplicationController

  def new

    @user = User.new

    @user.build_account

  end

end

 
プログラムが正常に走ったのはhas_many中:User#accounts.buildはhas_one中:User#build_account