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を作成します.
次の簡単な例を示します.
viewで
最初はaccountの内容を表示できませんでしたが、controllerでbuild accountがないことに気づき、
間違えて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の方法で書きます.コントロールを
プログラムが正常に走ったのはhas_many中:User#accounts.buildはhas_one中:User#build_account
次の簡単な例を示します.
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