ruby,rails,railscasts例子我搞砸了

时间:2010-04-10 05:23:50

标签: ruby-on-rails

如果您在嵌套表单上看到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>

所以&quot;&quot;不是构建新模板的正确信息,而且正在进行的是如何设置字段的字符串。例如fields= f.fields_for

4 个答案:

答案 0 :(得分:5)

看来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

答案 1 :(得分:1)

我也将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),但我仍然遇到同样的问题。

非常感谢您的帮助!

答案 2 :(得分:0)

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

答案 3 :(得分:-3)

如果您觉得由于升级到rails ver 3而导致gem list如果您安装了任何旧的rails版本,请输入:

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

在config文件夹中的environment.rb文件中。它也可以冻结您的应用程序的rails版本。