2016-12-04 5 views
0

一般的な方法のデータが渡され、部分的に利用できるようになるのに苦労しています。例えばRails 5レンダリング部分データとデータの受け渡し

static_pages_controller.rb:

def home 
    @feed_items = current_user.feed 
end 

home.html.erb:

Iは、部分をレンダリングするテンプレートにインスタンス変数をコントローラ渡すオフ有します

<%= render 'shared/feed' %> 

_feed.html.erb:

<%= render @feed_items %> 

さて、私のUserモデル内の彼女の記事を取得するためにデータベースに到達インスタンスメソッドは次のとおりです。

user.rb:だから何とかMicropost.where(...)は、マイクロポストのコレクションを返すため

def feed 
    Micropost.where("user_id = ?", id) 
end 

それは、Railsが_feed.html.erbから別の部分に行く方法を知っているからです。ここで、0123,は、マイクロポストの定義方法を定義していますか?

_micropost.html.erb:また

<li id="micropost-<%= micropost.id %>"> 
    <%= link_to adorable_avatar_for(micropost.user, size: 50), micropost.user %> 
</li> 

そして私は本当にRailsがmicropost変数を与えることを知っているmicropostsのコレクションを処理していますので、それが単なる慣習がありますか?

答えて

2

質問はRuby on Rails Guides on Layouts and Renderingで回答しています。

すべての部分は、部分的 (マイナスアンダースコア)と同じ名前のローカル変数があります。それだけでなく、以下に引用通路の前に来パーシャルについての情報を読む価値があります。オブジェクトのオプション:あなたは経由してこの ローカル変数へのオブジェクトを渡すことができます

<%= render partial: "customer", object: @new_customer %> 

顧客内の一部、顧客の変数は、親ビューから @new_customerを参照します。 (以前のガイドでは、render()の他のオプション、例えばobject:を指定するよう指示していますが、partial:と部分名を明示的に指定する必要があります)。

部分的にレンダリングするモデルのインスタンス、あなたは 速記構文を使用することができます

<%= render @customer %> 

@customerインスタンス変数は カスタマー・モデルのインスタンスが含まれていると仮定するとし、これはそれをレンダリングするために_customer.html.erb使用すると は、ローカル変数を渡します。顧客を部分に追加します。 は親ビューの@customerインスタンス変数を参照します。

3.4。5レンダリングコレクション

部分的な部分は、コレクションのレンダリングに非常に役立ちます。あなたが経由して、部分的に コレクションを渡す場合:コレクション・オプション、部分的意志は、コレクション内の各メンバーのために一度挿入され :

index.html.erb:

<h1>Products</h1> 
<%= render partial: "product", collection: @products %> 

_product.html。 ERB:部分は複数形のコレクションと呼ばれる

<p>Product Name: <%= product.name %></p> 

、その部分の 個々のインスタンスは 収集さレンデのメンバーへのアクセス権を持っています部分的に名前を付けられた変数を介して赤色になります。 このケースでは、partialは_productであり、_product partial内では を参照すると、productを参照してレンダリングされているインスタンスを取得できます。

また、省略形もあります。

<h1>Products</h1> 
<%= render @products %> 

Railsはを見て、使用する部分の名前を決定します@productsと仮定すると、製品のインスタンスのコレクション である、あなたは単に同じ結果を生成するためにindex.html.erb でこれを書くことができますコレクション内のモデル名は です。実際に、あなたも 異種コレクションを作成し、それをこのようにレンダリングして、Railsは コレクションの各メンバーのための適切な部分を選択しますすることができます

index.html.erb:

<h1>Contacts</h1> 
<%= render [customer1, employee1, customer2, employee2] %> 

顧客を/_customer.html.erb:

<p>Customer: <%= customer.name %></p> 

従業/ _employee.html.erb:

<p>Employee: <%= employee.name %></p> 

この場合、Railsは、顧客または従業員のパーシャルを、コレクションの各メンバーに適した として使用します。

コレクションが空の場合、レンダーはnilを返します。したがって、 代替コンテンツを提供するのはかなり簡単です。

<h1>Products</h1> 
<%= render(@products) || "There are no products available." %> 
関連する問題