我很难掌握数据传递的一般方式,并且可供部分人使用。
例如:
我有一个控制器将实例变量移交给呈现部分的模板:
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
变量吗?
答案 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." %>