如Railscast 197中所述在表单上动态添加子字段不使用:child_index参数来生成html名称属性

时间:2011-09-23 21:37:50

标签: jquery ruby-on-rails-3 railscasts

我有一个应用程序,我正在尝试添加记录,如Railscast编号197所示。我的对象更简单,因为我只有一个级别的父/子关系:患者和事件。该代码适用于删除子记录(事件),但添加记录失败的原因如下。我能够创建一个新的Object,生成要在表单上显示的字段,并且表单看起来没问题。但是,生成的html中name属性缺少:child_index。生成的html的一个例子是:

<textarea cols="30" id="patient_events_attributes_description" name="patient[events_attributes][description]" rows="3"></textarea>

现有记录的html是:

<textarea cols="30" id="patient_events_attributes_1_description" name="patient[events_attributes][1][description]"     rows="3">Opgepakt met gestolen goederen</textarea>

请注意,新html中缺少现有记录中的[1]。当然它不应该是1,而是new_xxx然后用唯一的数字代替。但是生成的html中缺少整个[new_xxx]。有没有人知道出了什么问题?

我正在使用Ruby 1.9.2,使用Rails 3.0.10。我只有没有原型的JQuery或者query-ujs。

我正在使用的代码如下所示,但它是Railscast代码的副本:

    def link_to_remove_fields(name, f)
    f.hidden_field(:_destroy) + link_to_function(name, "remove_fields(this)")
  end

  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|      # new_#{association}
      render(association.to_s.singularize + "_fields", :f => builder)
    end
    link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")
  end

function remove_fields(link) {
    $(link).prev("input[type=hidden]").val = "1";
    $(link).closest(".fields").hide();
}

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

我无法找到任何其他评论此代码不起作用,所以我必须做一些非常错误的事情。那里有什么想法吗?

1 个答案:

答案 0 :(得分:1)

在查看fields_for的源代码后,我发现了两个问题: 1.不使用:child_index参数,而不是使用:index选项。 2. fields_for仅在传递的对象是活动记录对象或数组时才生成正确的html。我将传递给类型数组的参数更改为新的空白对象作为[0]条目。

值得注意的是,没有此功能的文档。它使ROR非常耗时,除非你出生在那里。

最终运作的代码如下。请注意,如果要添加更多记录,则必须使用唯一编号替换“99”。

我仍然没有完全按照@ patient.update_attributes(params [:patient])给出一些错误,但最糟糕的部分(添加html)是固定的。

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