2016-12-04 32 views
0

我無法獲得關於數據傳遞的一般方式以及部分提供的問題。Rails 5呈現部分和傳遞數據

例如:

我有一個控制器越區切換出的實例變量的模板呈現的部分:

static_pages_controller.rb:

def home 
    @feed_items = current_user.feed 
end 

home.html.erb:

<%= render 'shared/feed' %> 

_feed.html.erb:

現在
<%= render @feed_items %> 

,我的用戶模型裏面是深入到數據庫,讓她的帖子實例方法:

user.rb:

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

所以在某種程度上,因爲Micropost.where(...)返回微觀柱的集合是Rails知道如何從_feed.html.erb轉到另一個部分,<li>是如何定義微博的?

_micropost.html.erb:

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

,也是它只是一個慣例,因爲我真的處理的microposts集合Rails所知道給予micropost變量?

回答

2

您的問題在Ruby on Rails Guides on Layouts and Rendering回答。這是值得一讀之下,以及引文之前出現的諧音信息:

每一個部分也具有相同的名稱作爲 部分(減去下劃線)的局部變量。您可以在這個 局部變量通過傳遞一個對象:對象選項:

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

在客戶部分,客戶變量將參考 @new_customer從父視圖。 (前面的指南指示爲render()指定其他選項,例如對象:,必須明確指定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> 

當部分是帶一個多元化的集合,則局部的 各個實例有權訪問 託收仁德的構件紅色通過部分後命名的變量。在 這種情況下,部分是_product,並在_product部分中,您可以參考產品以獲取正在呈現的實例。

這也是一個簡寫。假設@products是產品實例的集合 ,你可以簡單地在index.html.erb 寫這篇文章,以產生相同的結果:

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

Rails的決定通過查看使用部分的名稱 集合中的模型名稱。事實上,你甚至可以創建一個 均質集合體,並使其通過這種方式,和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將使用客戶或員工分支作爲 ,適用於集合中的每個成員。

如果集合爲空,則渲染將返回零,因此 提供替代內容應該相當簡單。

<h1>Products</h1> 
<%= render(@products) || "There are no products available." %>