2

我有一个应用程序,我正在尝试添加 Railscast 编号 197 中所示的记录。我的对象更简单,因为我只有一个级别的父/子关系:患者和事件。该代码适用于删除子记录(事件),但由于以下原因添加记录失败。我能够创建一个新对象,生成要在表单上显示的字段,并且表单看起来不错。但是,生成的 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));
}

我找不到任何其他评论表明此代码不起作用,所以我一定是做错了什么。有什么想法吗?

4

1 回答 1

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)}\")")

结尾

于 2011-09-24T21:13:18.563 回答