【问题标题】:ruby, rails, railscasts example I messed upruby, rails, railscasts 例子我搞砸了
【发布时间】:2010-04-10 05:23:49
【问题描述】:

如果您在嵌套表单上看到railscasts,这是动态创建链接的辅助方法。但是,在我升级到 ruby​​ 1.9.2 和 rails 3 之后,这不起作用,我现在知道为什么了。

    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

这里是javascript

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

}

当我查看源代码时,链接是这样呈现的:

<p><a href="#" onclick="add_fields(this, &quot;dimensions&quot;, &quot;&quot;); return false;">Add Dimension</a></p>

所以&amp;quot;&amp;quot; 不是构建新模板的正确信息,并且字段字符串的设置方式正在发生一些事情。比如fields= f.fields_for

【问题讨论】:

  • 我还没有在 Rails 3 中尝试过嵌套表单,但 AFAIK 在这方面并没有太大变化。您需要在此处提供更多详细信息,具体是什么不起作用?尝试使用 Firebug 来帮助确定问题。
  • 我稍后会在问题中添加更多代码。

标签: ruby-on-rails


【解决方案1】:

f.fields_for 似乎不再返回渲染字段的字符串。我猜这是 ERB Blocks change 的副作用,在这种情况下它只适用于 Rails 3 Beta 2。我认为这是一个错误,希望它会在最终版本之前得到修复,但现在你可以做到像这样的快速修复:

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

【讨论】:

【解决方案2】:

我也在将 Ryan 的嵌套表单实现到 Rails 3 (Ruby 1.9.2) 应用程序中,但遇到以下错误:

undefined method `klass' for nil:NilClass

就以下辅助方法的第 2 行而言:

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

有人知道是什么原因造成的吗?

我认为这可能与我使用的 ruby​​ 版本有关(即我最初使用的是 REE,但现在已切换到 1.9.2),但我仍然遇到同样的问题。

非常感谢您的帮助!

【讨论】:

【解决方案3】:

在 Rails 3.0.9 中,您可以通过替换此代码来解决此问题

link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")"))

通过这个

link_to_function(name, "add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")

【讨论】:

    【解决方案4】:

    如果您觉得这是因为升级到 rails 版本 3,那么请执行 gem list 如果您安装了任何较旧的 rails 版本,请输入以下内容:

    RAILS_GEM_VERSION = '(Your older rails version here)' unless defined? RAILS_GEM_VERSION

    在您的配置文件夹中的 environment.rb 文件中。为您的应用冻结您的 Rails 版本也很好。

    【讨论】:

    • Rails 版本在 Rails 3 中的 Gemfile 中进行管理。项目也不能那么容易地从 3 降级到 2。