【问题标题】:Rails 5 rendering partials and passing dataRails 5 渲染局部和传递数据
【发布时间】:2017-04-18 18:24:30
【问题描述】:

我无法理解数据传递和提供给部分数据的一般方式。

例如:

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

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 转到另一个部分,而&lt;li&gt; 是为定义微帖子的方式而定义的?

_micropost.html.erb:

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

而且这只是一个约定,因为我真的在处理 Rails 知道给 micropost 变量的 microposts 集合吗?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    如果你有一个模型实例要渲染成一个局部,你可以 使用简写语法:

    <%= render @customer %>
    

    假设@customer 实例变量包含一个 Customer 模型,这将使​​用 _customer.html.erb 来呈现它并 将局部变量 customer 传递到部分中,这将 引用父视图中的@customer 实例变量。

    3.4.5 渲染集合

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

    index.html.erb:

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

    _product.html.erb:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-12-16
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 2017-08-23
      相关资源
      最近更新 更多