使用content_for确定命名yield的正确用法

时间:2015-05-25 07:31:05

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

我有很多不同形式的共享代码,我正在尝试使用命名的yield。我希望_nav.html.haml使用content_for块中定义的每个页面的字段呈现表单。

示例视图:

- content_for :form_fields do
  = f.text_field :name
  = f.text_field :number

= render :layout => 'projects/shared/nav', locals: {:url => projects_path, :form => @form}

_nav的内容:

 = form_for(form, url: url, layout: :horizontal) do |f|
   = f.alert_message "Please fix the errors below before saving this page."
   = yield :form_fields

我在示例视图中收到以下错误:

undefined local variable or method `f'

2 个答案:

答案 0 :(得分:1)

您没有将表单对象传递给content_for。这就是它显示错误的原因。

不幸的是,除了名称和块之外,您无法将任何参数传递给content_for。

=> yield(:block_name, form_object)
ArgumentError: wrong number of arguments (2 for 0..1)
from /test/.rvm/gems/ruby-2.1.5/gems/actionpack-4.0.2/lib/action_view/context.rb:31:in `_layout_for'

呈现content_for视图的方法仅使用块的名称。在这里查看。 http://www.rubydoc.info/docs/rails/4.1.7/ActionView/Context:_layout_for

你不应该在这里使用content_for。这里的正确解决方案是" Partials"

http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials

答案 1 :(得分:0)

在将表单传递给content_for块后遇到困难,我最终删除了content_for并重新安排了我的代码,如下所示:

= render :layout => 'projects/shared/nav', locals: {:url => projects_path, :form => @form} do
  = @f.text_field :name
  = @f.text_field :number

收益如此:

= form_for(form, url: url, layout: :horizontal) do |f|
    - @f = f
    = f.alert_message "Please fix the errors below before saving this page."
    = yield

感觉有点乱,但我无法通过其他方式传递表格,按预期工作。