Rails 5渲染部分和传递数据

时间:2016-12-04 06:12:57

标签: ruby templates ruby-on-rails-5 partial

我很难掌握数据传递的一般方式,并且可供部分人使用。

例如:

我有一个控制器将实例变量移交给呈现部分的模板:

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模型中有一个实例方法,它可以进入数据库以获取帖子:

user.rb:

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

所以不知何故因为Micropost.where(...)返回一个微博的集合是Rails如何知道从_feed.html.erb转到另一个部分,其中<li>被定义为如何定义微博? / p>

_micropost.html.erb:

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

它也只是一个惯例,因为我真的处理了一个microposts的集合,Rails知道给micropost变量吗?

1 个答案:

答案 0 :(得分:4)

您的问题已在Ruby on Rails Guides on Layouts and Rendering中得到解答。值得阅读下面引用段落之前的部分信息:

  

每个partial也有一个与该名称相同的局部变量   部分(减去下划线)。您可以将对象传递给此对象   局部变量通过:object选项:

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

在客户部分内,客户变量将参考   父视图中的@new_customer。 (之前的指南指示为render()指定其他选项,例如object:,您必须明确指定partial:和部分名称。)

     

如果要将模型实例渲染为局部,则可以   使用简写语法:

<%= render @customer %>
     

假设@customer实例变量包含一个实例   客户模型,这将使​​用_customer.html.erb来呈现它   将本地变量客户传递给将要的部分   请参阅父视图中的@customer实例变量。

     

3.4.5渲染集合

     

部分在渲染集合时非常有用。当你通过   通过:collection选项收集部分,部分将   为集合中的每个成员插入一次:

     

index.html.erb:

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

_product.html.erb:

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

当使用复数集合调用partial时,则   部分的个别实例可以访问该成员   通过以partial命名的变量呈现的集合。在   这种情况下,部分是_product,在_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将使用客户或员工部分   适合该集合的每个成员。

     

如果集合为空,渲染将返回nil,所以   提供替代内容应该相当简单。

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