web-dev-qa-db-ja.com

@objectをRails部分レンダリングに渡す

私は部分的です:

'profiles/_show.html.erb'

次のようなコードが含まれています

<%= @profile.fullname %>

パーシャルをレンダリングしようとしていますが、@ profileを渡す方法がわかりません。ローカルを使用してみましたが、どうやら「@profile」ではなく「profile」がパーシャルに設定されているようです。

<%= render :partial => 'profiles/show', :locals => {:profile => @app.profile} %>

それをオブジェクトではなく@objectとして渡す方法はありますか、それともこのように設計されていますか?

20
David C

パーシャルでインスタンス変数(名前が「@」で始まる変数、例:@object)を使用することが非常に重要なのはなぜですか?入るのは良い習慣ではありません。パーシャルでインスタンス変数を使用すると、制御フローが複雑になり、バグが発生しやすくなり、パーシャルの再利用がより困難になります。この ブログ投稿 問題をもう少し詳しく説明します。

本当にあなたには2つの選択肢があります。最初のオプションは、推奨される解決策です。

  1. すべてのインスタンス変数をローカル変数に変更し、renderのlocals引数を使用してパーシャルに渡します。

  2. パーシャルがレンダリングされる前にインスタンス変数を設定します。パーシャルは、コントローラーが設定するすべてのインスタンス変数にアクセスできます。

ここでも、パーシャルのインスタンス変数は不良です。パーシャルがすでにそれらを使用するように記述されているという理由だけで、インスタンス変数を設定しないでください。代わりにパーシャルを書き直してください。

34
EmFi

確かに、引用 this あなたが知っておくべきブログ投稿:

パーシャルは再利用可能なビューテンプレートであり、特定のページを構成するコンポーネントを論理的でまとまりのある部分にモジュール化できます。必要なデータがパーシャルに渡されない場合、後で再利用または変更することが難しいことがよくあります。

Rails guides サイトでは、いくつかの簡単な使用例について説明しています。

ローカル変数をパーシャルに渡すこともでき、それらをさらに強力で柔軟にします。たとえば、この手法を使用して、新しいページと編集ページの間の重複を減らしながら、少し異なるコンテンツを保持することができます...

したがって、特定のケースでは、それを行うための簡単で強力な方法があります

<%= render partial: 'show', locals: {profile: @profile} %>

追加のヒント:
おそらく部分的な名前付きのショーは良い選択肢ではありません。再利用しようとしているものに関連して、より意味のある名前を付けてください。これは、実際にshowメソッドがある場合、RESTfulシナリオではさらにエラー/混乱が発生しやすいように聞こえるので、おそらく_ show.html.erbファイルとshow.html.erbファイル。

これがお役に立てば幸いです。

14
Javier Cadiz

Rails 3+の場合、実際の質問に対する答えは次のとおりです。

<%= render 'profiles/show', :@profile => blah %>

パーシャルには、ローカルで@profileが表示されます。

これが良いアプローチだと言っているのではありません。これが醜いかどうかは正直わかりません。しかし、それは機能します。

5

これはもっと簡単です

<%= render :partial => "profiles/show", :collection => @profiles %>

部分的な_show.html.erb

<%= profile.fullname %>

助けてくれることを願っています

1
Ahmad Ramdani

あなたはいつでも@profile = profile部分的に。

1
Jim