2011-06-28 51 views
1

我已經遵循嵌套窗體上的railscasts插曲(第1部分和第2部分),並且難以使用jquery添加字段,但是當我單擊刪除字段鏈接時,字段獲取除去。 這是代碼。
在我的問題模型我有
問題通過jQuery形式添加字段嵌套的形式railscasts集

class Question < ActiveRecord::Base 
has_many :tags, :class_name => "Tag", :dependent => :destroy, :foreign_key => "question_id" 
accepts_nested_attributes_for :tags, :reject_if => lambda { |a| a[:keyword].blank? }, :allow_destroy => true 

在我的標籤模式,我有

class Tag < ActiveRecord::Base 
    attr_accessible :keyword, :question_id 
    belongs_to :question, :class_name => "Question", :foreign_key => 'question_id' 
end 

在我的問題形式,我有

<%= form_for @question, :url => { :controller => "questions", :action => "create" } do |f| %> 
    <%= f.label(:name, "Request Question:") %>&nbsp;&nbsp; 
    <%= f.text_field(:name, :size => 72, :maxlength => 120) %><br /> 
    <%= f.fields_for :tags, :url => { :controller => "tags", :action => "create" } do |builder| %> 
     <%= render "tag_fields", :f => builder %> 
    <% end %> 
    <p><%= link_to_add_fields "Add new tag", f, :tags %></p> 
<% end %> 

在我tag_fields部分

<p class="fields"> 
    <%= f.label(:keyword, "Keywords:") %>&nbsp;&nbsp; 
    <%= f.text_field(:keyword, :size => 20, :maxlength => 25) %> 
    <%= link_to_remove_fields "remove", f %> 
</p> 

在application_helper.rb

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

後來終於在我的application.js

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

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

我檢查過是否在頁面源代碼中包含文件。該jquery的作品,因爲我的應用程序的其他部分 正在工作。當我點擊添加新標籤時,我不會收到任何錯誤。 我看過其他的解決方案,但沒有爲我工作。我似乎無法添加字段。 感謝您的幫助

+0

當你點擊添加標籤時,你會得到html吐出嗎? (像文本格式化的HTML,沒有注入到文檔中)或者什麼也沒有? – Msencenb

+0

@Minnb嗨,謝謝,結帳我的答案,不知道爲什麼它的作品,但我認爲它與軌道3和link_to_function有關。起初我沒有收到任何html。不知道爲什麼? – Hishalv

回答

2

我設法弄清楚了這一點,但我不確定它是否是最好的方法。
application_helper.rb我改變了下面一行從該

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

這個

link_to_function(name, "add_fields(this, '#{association}', '#{escape_javascript(fields)}')", :remote => true) 

我不是100%肯定,爲什麼它的工作原理,但我相信它該怎麼做導軌3不再具有link_to_function。希望這個幫助

+1

我認爲link_to_function仍然存在於rails 3中(您正在使用它在應用程序助手中),但它看起來像html清理函數(h)在某種程度上搞砸了它。我鼓勵你在沒有remote =>:true的情況下測試它,但也沒有h,我相信它應該可以工作 – Msencenb