2010-04-10 48 views
0

如果您在嵌套窗體上看到railscasts,這是動態創建鏈接的助手方法。然而,在我升級到Ruby 1.9.2和Rails 3之後,這不起作用,現在我已經明白了爲什麼。ruby​​,rails,railscasts example我搞砸了

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

+0

我還沒有嘗試在Rails 3中嵌套形式尚未解決這個問題,但據我所知這方面沒有太大改變。你需要在這裏提供更多的細節,具體是什麼不工作?嘗試Firebug來幫助確定問題。 – ryanb 2010-04-10 05:43:50

+1

哇,這個人自己! – s84 2010-04-10 06:10:08

+0

我會在一秒鐘內向該問題添加更多代碼。 – s84 2010-04-10 06:10:46

回答

5

看起來f.fields_for不再返回呈現字段的字符串。我猜這是ERB Blocks change的一個副作用,在這種情況下,它只適用於Rails 3 Beta 2.我認爲這是一個bug,希望它能在最終發佈之前得到修復,但現在你可以快速完成解決這樣的:

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 
+0

謝謝ryanb。和偉大的railscasts! – s84 2010-04-10 17:06:07

+0

我更新了使用safe_concat的答案,在這裏可能會更好。我還提交了有關此問題的錯誤報告:https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/4363-fields_for-not-working-outside-erb – ryanb 2010-04-10 17:34:17

-3

如果你覺得它是由於升級到軌第四版然後做一個gem list如果您有任何舊軌安裝,然後鍵入此版本:environment.rb文件中

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

在你的配置文件夾中。它也很好的凍結你的應用程序的rails版本。

+0

Rails版本在Rails 3的Gemfile中管理。項目也不能輕易從3降級到2。 – ryanb 2010-04-10 15:36:04

1

我太貫徹瑞安的嵌套形式到一個Rails 3(紅寶石1.9.2)的應用程序,但我面臨着以下錯誤:在第2行方面

undefined method `klass' for nil:NilClass 

以下幫手方法:

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),但我仍然收到同樣的問題。

非常感謝您的幫助!

+0

http:// stackoverflow。 COM /問題/ 5746006 /有一對多,通過嵌套形式 - 即燦累積乘法insctance – Seanland 2011-12-07 18:46:09

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