2016-12-04 81 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." %>