我可以将哪些内容传递给Rails partials中的局部变量?

时间:2015-12-12 18:58:32

标签: ruby-on-rails ruby-on-rails-4

我有一个名为“_share_links”的部分,它是一组让用户分享帖子的按钮。

预填充这些链接的文字和摘要内容在不同页面上会有所不同。例如,在显示事件的页面上,我想在预先填充的链接中使用事件的名称。但是,在不同的页面上,我可能想要在链接中使用帖子标题。

我尝试使用下面的代码完成此操作,但我收到“未定义的局部变量'名称'”错误。

show.html.erb

<%= render partial: "layouts/share_links", locals: { page: @event, name: @event.name, body: @event.description } %>

_share_links.html.erb

<ul class="share-links">
   <li><a href="https://twitter.com/intent/tweet?text=<%=u name %>&url=<%= request.original_url %>" target="_blank"><%= embedded_svg "twitter.svg", class: "svg-icon twitter svg-circle" %></a></li>
</ul>

实现类似内容并将不同的对象属性传递给部分内容的最佳做法是什么?

由于

2 个答案:

答案 0 :(得分:1)

  

我可以将哪些内容传递到Rails partials中的局部变量?

任何。它只是部分渲染上下文中的局部变量。 Rails不会质疑你用它做什么。

  

最佳做法是什么?

当地人是一种通用工具,很难说有任何最佳做法。

本地人的要点是它可以让你成为一个功能结构。这意味着你的部分将采取一定的输入并确定性地创建一个html输出。这使它们非常强大并且易于单独测试。因此,在这种意义上使用当地人可以被视为最佳实践。

所以让我们首先删除耦合到request并清理凌乱的字符串插值:

<ul class="share-links">
  <li>
    <% share_uri = "https://twitter.com/intent/tweet?" + { url: url, text: text }.to_query %>
    <%= link_to share_uri, target: "_blank" do %>
      <%= embedded_svg "twitter.svg", class: "svg-icon twitter svg-circle" %>
    <% end %>
  </li>
</ul>

现在我们可以通过以下方式来调用它:

<%= render partial: "layouts/share_links", text: @event.name, url: url_for(@event) %>

这将为特定事件创建共享链接。如果你想在页脚上有一个通用按钮,它可以共享当前页面:

<%= render partial: "layouts/share_links", text: 'Something generic', url: request.original_url %>

不再需要使用密钥locals - Rails会将任何其他选项传递给部分。

另一个问题是在哪里组织你的部分。我认为views/layouts应该只包含你猜对了,布局。

不属于某个资源的部分通常放在名为views/shared的文件夹中。

答案 1 :(得分:0)

更简洁的方法是pass an object到部分,如果你对每个模型都有相同的属性,那就特别强大:

<%= render "layouts/share_links", object: @event, as: :obj %>

然后在你的部分,你可以使用:

<ul class="share-links">
   <li><a href="https://twitter.com/intent/tweet?text=<%=u obj.name %>&url=<%= request.original_url %>" target="_blank"><%= embedded_svg "twitter.svg", class: "svg-icon twitter svg-circle" %></a></li>
</ul>

这完全取决于你的对象是否有类似的属性。