2011-08-22 118 views
6

我在show.erb嵌套属性和我创建一个空白嵌套的属性,在像这样的底部显示与空白项目的网格。添加删除链接,嵌套属性

<%= form_for @question do |q| %> 
    <% q.fields_for :answers, @question.answers do |l| %> 
    <tr> 

     <td><%= l.text_field :text %></td> 
     <td><%= l.check_box :correct %></td> 
     <td><%= l.text_field :imagename %></td> 
     <td><%= l.number_field :x %></td> 
     <td><%= l.number_field :y %></td> 
    </tr> 
    <% end %> 

    <tr> 
     <td colspan=5 align=right><%= submit_tag '+' %> 
    </tr> 

<% end %> 

我想的link_to“消灭”的工作,但我得到undefined method 'plural'当我加入这给电网

<%= link_to 'Destroy', l, :controller => "answer", :confirm => 'Are you sure?', :method => :delete %> 

回答

21

为什么要使用链接?您还可以在嵌套属性中使用销毁功能。

所有你需要做的就是在你的accepts_nested_attributes定义添加:allow_destroy => true并添加

<%= l.check_box '_destroy' %> 

到每个记录。 这样可以在保存记录时使用复选框删除所有嵌套记录。

1

你使用l变量是不正确的。当您从fields_for块中屈服时,块对象是FormBuilder的一个实例,而不是该对象本身的一个实例。您希望链接指向哪个网址?它是Answers#destroy?你想发送什么标识到这个动作来确定要销毁什么? A link_to不是表单元素。它只是锚标签的帮手。你需要一个url,而不是一个表单生成器来建立该链接。

这是一个答案表的列表吗?每个答案一个?如果是这样,你可能想循环使用它们,而不是仅仅使用fields_for

希望这可以帮助你走上正确的轨道。

+0

是的,我是一个白痴不通过模型,而不是表单生成器 –

9

对于那些来自谷歌发现这一点,而技术上删除复选框可能是正确的做法,我认为这是令人困惑 - 唯一的好处是,它需要两次点击删除(选择框和命中更新)。确保删除清楚发生的情况可能会更好,并可能添加一条简单的方法将其恢复。

下面是将更新发送到服务器的AJAX,来处理在回调或JS视图文件更新页面。删除遥控器:true,它将作为常规链接工作。

# For my form I build a new object if it's missing, 
# so I need to check that this is not a new nested attribute. 
- unless question.answers.new_record? 
    # Basically, I am sending over the fields that would be sent 
    # by the _delete check box form being updated. 
    = link_to "Delete", question_path(question.id, question: { answers_attributes: { id: question.answers.id, "_destroy" => true }}), remote: true, confirm: "Really delete?", method: :put 
+1

是的,这工作正常has_many关系。 此外,要获得确认框,您可以添加',data:{confirm:'您确定吗?' }'方法后:'put' 我注意到的一件事(至少在我的情况下)是该项目被删除,但页面没有自动重新加载。 – 8bithero

+0

感谢has_many的确认(不知道为什么它不会工作)。在你的评论中还添加了一些关于确认的注释,如果你删除了remote:true,它应该像普通链接一样工作并刷新页面 - 否则你必须自己处理。 – d3vkit

+0

我同意,UX的删除复选框非常奇怪 – Dex