2013-02-27 42 views
0

我想從嵌套模型軌道鑄造創建一個複雜的形式。項目和任務是我擁有的兩種形式。任務屬於項目。項目有許多任務。添加刪除鏈接不工作在複雜的嵌套形式

我的表單已成功創建,兩個模型之間的關係顯示正確​​。我可以銷燬項目並刪除與項目相關的任務。當我嘗試使用JavaScript刪除項目並將任務添加到項目時,會出現我的問題。鏈接成功創建,表單成功載入瀏覽器,我可以提交表單沒有問題,但是當我點擊「刪除」或「添加」鏈接沒有任何反應。

沒有在日誌中,在瀏覽器中沒有錯誤消息。這裏是我的application.js和我的application_helper.js和表單。

的application.js

//= require jquery 
//= require jquery_ujs 
//= require jquery.ui.all 
//= require_tree . 
function remove_fields(link) { 
    $(link).previous("input[type=hidden]").value = "1"; 
    $(link).up(".fields").hide(); 
} 
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) 
    }); 
} 

application_helper.js

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, :f => builder) 
     end 
     #link_to_function(name, h("add_fields(this, \"#{association}\", \"#{escape_javascript(fields)}\")")) 
     link_to_function(name, "add_fields(this, '#{association}', '#{escape_javascript(fields)}'')") 
    end 
end 

_form.html.erb

<p> 
    <%= f.label :name, "Name" %> 
    <%= f.text_field :name %> <br /> 
    <%= f.label :description, "Description" %> 
    <%= f.text_field :description %> <br /> 
    <%= f.label :project_id, "Project ID" %> 
    <%= f.text_field :project_id %> <br /> 
    <%= f.label :id, "ID" %> 
    <%= f.text_field :id %> 
    </p> 

    <h3> Tasks for Project </h3> 
    <%= f.fields_for :tasks do |builder| %> 
     <%= render 'task', :f => builder %> 
    <% end %> 
    <p><%= link_to_add_fields "Add Task", f, :tasks %> 
    <p><%= f.submit "Submit" %></p> 

<% end %> 

_task.html.erb

<div class="fields"> 
    <%= f.label :name, "Name" %> 
    <%= f.text_field :name %></br > 
    <%= f.label :description, "description" %> 
    <%= f.text_area :description, :rows => 3 %><br /> 
    <%= link_to_remove_fields "remove", f %> 
</div> 

回答

1

當你正在使用jQuery,你應該使用的up()parent()而是這是一個原型功能,改變insert()append()。所以,你的JavaScript代碼看起來像:

function remove_fields(link) { 
    $(link).previous("input[type=hidden]").val(1); 
    $(link).parent(".fields").hide(); 
} 
function add_fields(link, association, content) { 
    var new_id = new Date().getTime(); 
    var regexp = new RegExp("new_" + association, "g") 
    $(link).parent().append(content.replace(regexp, new_id)); 
} 

但是,如果你不想寫自己所有的這些亂七八糟的東西,你可以使用nested_form gem。對於複雜的表單來說,這真是一個好的寶石。

+0

我將不得不放棄這一點,因爲我花了太多時間試圖讓語法正確。 Nested_form寶石是!感謝您的建議。 – rubynooby 2013-02-28 20:41:20

0

首先,你忘了結束您< p>在link_to_add_fields線

然後,也許這下面的行不正確你的jQuery的版本執行。

$(link).up().insert({ 
    before: content.replace(regexp, new_id) 
}); 

可以肯定不會有問題,請嘗試line_to_add_field

之前寫這行並把前3個行

$('#task_attributes').append(content.replace(regexp, new_id)); 

如果沒有按」 t工作,請更新您的第一條消息以顯示「link_to_add_field」導軌功能的生成代碼。

相關問題