Ruby on Rails / Haml与partials和嵌套表单有关

时间:2012-05-09 21:05:57

标签: ruby-on-rails haml

我正在创建一个嵌套表单并使用Ryan Bates Railscast。我正在创建一个使用部分的典型表单。

= form_for(@project, :html => { :class => 'addProjectForm' }) do |f|
  ...
  %p
    = f.fields_for :crew_members do |crew|
      #fields
      = render 'crew_member_fields', :m => crew
      = link_to_add_fields "Add Crew Members", f, :crew_members
  %p

然后我调用一个帮助类来克隆“fields”类并将其添加到我的表单中。

module ProjectsHelper
  def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render(association.to_s.singularize + "_fields", :f => builder)
    end
    link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
  end
end

助手类然后调用javascript函数来处理细节。

function add_fields(link, association, content) {
        var new_id = new Date().getTime();
        var regexp = new RegExp("new_" + association, "g");
        $(link).parent().before(content.replace(regexp, new_id));
}

我的问题是我添加

= link_to_add_fields "Add Crew Members", f, :crew_members

行,我收到错误

undefined local variable or method `m' for #<#<Class:0xa763964>:0xa761588>

    Extracted source (around line #1):

    1: = m.label "Crew Member Name"
    2: = m.label "Crew Member Role"
    3: %br
    4: = m.text_field :name

这使得看起来部分没有得到构建器变量,但是如果我没有

= link_to_add_fields "Add Crew Members", f, :crew_members

行,然后部分显示就好了。我对如何调试下一个感到困惑。对不起,很长的帖子,但我希望你能掌握所有的信息。谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

我认为你的助手有一个错字。

module ProjectsHelper
  def link_to_add_fields(name, f, association)
    new_object = f.object.class.reflect_on_association(association).klass.new
    fields = f.fields_for(association, new_object, :child_index => "new_#{association}") do |builder|
      render(association.to_s.singularize + "_fields", :f => builder)
    end
    link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))
  end
end

render(association.to_s.singularize + "_fields", :f => builder)应该是 render(association.to_s.singularize + "_fields", :m => builder)