【问题标题】:Ruby on Rails pass reference to yield (template)Ruby on Rails 将引用传递给 yield(模板)
【发布时间】:2012-09-17 20:54:03
【问题描述】:

长话短说:我的每个选项卡都有自己的表单,所以我决定制作一个单独的布局,并让表单本身作为布局的可变内容。

但我需要 form_for 在布局中,而不是在每个表单中都有它,因为我在布局中还有一些其他常见的表单元素。

那么如何将表单构建器的引用 f 传递给模板?

布局代码:

<% content_for(:content) do %>
  <%= form_for current_form do |f| %>
    <%= yield %>
    <%= f.submit "Submit" %>
  <% end %>
<% end %>

有可能吗?

P.S 找到了这个:DRYing up a helper: wrap form_for and access local form variable(@rubish 的回答),但 &lt;%= yield f %&gt; 似乎不起作用,f 仍然未定义视图。

【问题讨论】:

  • 这里有人吗?需要帮助! :P @rubish,你能帮忙解决这个问题吗?

标签: ruby-on-rails ruby reference block yield


【解决方案1】:

为什么不为选项卡制作一个通用模板(不是布局),并为每个选项卡的内容使用一个部分模板?

然后你可以这样做:

<%= render :partial => @tab_name, :locals => {:form => f} %>

【讨论】:

  • 为什么我们需要布局呢?只是为此使用部分似乎不正确。你是说没有办法通过f?
  • 我不知道是否有办法将f 从布局传递到模板。这只是可以解决您的问题的一个想法-可能还有其他方法。我认为布局的价值在于 all 从控制器调用的模板可以自动嵌套在布局中。
  • 恕我直言,模板 = 布局。模板(布局)包含一个视图(由控制器调用)实例。单个视图包含许多部分。顺便说一句,您对此有何看法:stackoverflow.com/questions/6511028/…(请参阅最后一个答案)。
  • 啊。似乎我的问题没有直接的解决方案。会坚持你的! =)
【解决方案2】:

你可以在 Rails 中使用 render 的 layout 选项来渲染一个接受块的模板

假设您有一个要渲染几次的表单,但您希望每次都自定义提交部分。您可以通过将表单部分呈现为布局并传入块来实现此目的。然后,您的模板或部分模板将用作您传入的块的周围布局。然后您可以将表单返回到块并访问块中的表单。

record/_form.haml

= form_for record do |form|
  ...
  .form-actions
    yield(form)

为了让你的模板 record/_form.haml 在你渲染它时接受一个块,你可以使用 render 的 layout 选项将你的模板渲染为你的块的布局:

record/edit.haml

= render layout: 'form', locals: { record: record, ... } do |form|
  .form-actions--primary
    = form.button :submit

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-26
    • 2013-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    相关资源
    最近更新 更多