2016-09-17 7 views
0

足場を使ってFooモデル/コントローラを生成するとき、私のコントローラには@foo.saveがfalseを返す場合、render :newのデフォルトの作成アクションがあります。レンダリングはインスタンス変数と何をするのですか?

render :newの場合、私の@fooオブジェクトはどうなりますか?

マイ株式new.html.erbビューは、私はそれが私のアクションを作成します(というよりも新しい方法で再び@foo = Foo.newで新しいオブジェクトを作成)から@fooを再利用することを考えさせるれ、@foo.errorsを指します。これは当てはまりませんか?

新しい名前空間のコントローラ(これ以外のものはすべて同じです)でこの規約を再利用したいので心配していますが、render :newが発生した場合は@fooにはnilが返されます。 Fooオブジェクトを再利用することも、新しいオブジェクトを作成することもないようです。だから私はより良いレンダリングを理解しようとしています。

答えて

1

renderアクションにnewを呼び出すことはありません、それだけでファイルnew.html.erb(または何でも)を処理し、ブラウザに送信します。そのテンプレートをレンダリングするときに、作成アクションで作成されたインスタンス変数@fooが使用されます。そのため、レコードが保存されなかった場合は、フォームがレンダリングされたときにフォームのフィールドにユーザーの情報が表示されます(フォームが正しく設定されている)。代わりに、レンダリングの

あなたが新鮮@fooインスタンス変数とまったく新しい要求を開始する場合は

は、あなたが redirect_to :new、あるいは単に手動 renderへの呼び出しの前に @foo = Foo.newを設定することができます。

「新しい名前空間のコントローラ」を使用している場合は、同じコントローラではありません。質問から何をやっているのかははっきりしませんが、コントローラーに@newを設定してから別のコントローラーにアクセスしようとすると、決してうまくいかないでしょう。

1
ドキュメントから

あなたが同じコントローラ内の別のテンプレートに対応してビューをレンダリングしたい場合は、ビューの名前をレンダリング使用することができますので、

renderは、ビューテンプレートのレンダリングに使用され、実際にアクションを呼び出さない。レンダリングするビューの名前は、stringまたはsymbolのいずれかです。

render 'new' # renders new.html.erb 

render :new # renders new.html.erb 

だから、あなたのケースでは、ときrender :newcreateアクションでは実行され、あるんすべてのコントローラはcreateアクションからインスタンス変数@fooに渡すnew.html.erbをレンダリングします。そのため、@fooが無効なオブジェクトを参照しているため、レコードの保存に失敗したときにビュー内に@foo.errors.full_messagesが表示されます。

つまり、renderは指定したテンプレートをレンダリングするだけで、オブジェクトを再作成するアクションは呼び出されません。

renderメソッドに渡すパラメータは、actionの名前である必要はありません。実際のビューファイルにパスを渡すこともできます。有効な引数の全リストについては

、このことができます http://guides.rubyonrails.org/layouts_and_rendering.html#using-render

ホープセクション2.2.4を参照してください。