销毁rails 4中的嵌套字段

时间:2013-09-06 20:25:56

标签: ruby-on-rails ruby-on-rails-4 destroy

美好的一天,

我正在尝试使用RoR 4中的链接列表创建简单的表单,可以对其进行编辑和删除。

我在主帖模型文件中允许“销毁” 控制器 - > posts.rb

class Post < ActiveRecord::Base
has_many(:links, :dependent => :destroy)

accepts_nested_attributes_for :links,    :reject_if => lambda { |a| a[:link].blank? },   :allow_destroy => true

我正在创建和更新控制器

接受destroy的参数
    def create
    @new_post = Post.new(params[:post].permit(:title, :body, :tag_list,     links_attributes:[:link, :_destroy]))

    if @new_post.save
        redirect_to posts_path, :notice =>"Saved!"
    else
        render new
    end
end

def update
    @post_to_update = Post.find(params[:id])

    if @post_to_update.update(params[:post].permit(:title, :body, :tag_list,    links_attributes:[:link, :_destroy]))
        redirect_to posts_path, :notice =>"Updated!"
    else
        render edit
    end
end

我正在使用jQuery删除链接字段并将其destroy值设置为“true”

<h1> Edit post </h1>
<%= form_for @post_to_edit do |f|%>
    Title <%= f.text_field :title %> </br>
    Body <%= f.text_area :body %> </br>
    <%= f.fields_for :links do |b| %>
    <li class = "enter_link">
        <%= b.text_field :link %>
        <%= b.hidden_field :_destroy %>
        <%= link_to_function "Remove", "remove_fields(this)" %></br>
    </li>
    <% end %>
    Tags <%= f.text_field :tag_list %>
    <%= f.submit "Update that bitch!" %>
<% end %>

的Javascript

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

}

这就是问题所在: 假设我有一个3个链接列表

"link 1"
"link 2"
"link 3"

我希望通过删除第2和第3个链接来编辑该列表。 一旦我按下更新,销毁参数就会传递给控制器​​,但它不会删除原始行。

现在我将获得以下列表

"link 1"
"link 2"
"link 3"
**"link 1" (again, after removing link number 2 and 3)**

一如既往 感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

让我让您的生活更轻松,并推荐这款名为Cocoon(https://github.com/nathanvda/cocoon

的宝石

它创建了简单的嵌套表单。

只需将此代码粘贴到帖子表单视图中即可。

  f.fields_for :links do |link|
  render 'link_fields', :f => link
  link_to_add_association 'add link', f, :tasks

使用cocoon,嵌套表单需要部分,因此创建一个名为_link_fields.html.erb的文件

并确保将所有内容放在div中。他们的文件并不清楚,但根据经验我知道它的必要性。

<div class="nested-fields">
f.label :link
f.text_field :link
link_to_remove_association "remove link", f
</div>

就是这样!

答案 1 :(得分:2)

改变这个:

def update
    @post_to_update = Post.find(params[:id])

    if @post_to_update.update(params[:post].permit(:title, :body, :tag_list,    links_attributes:[:link, :_destroy]))
        redirect_to posts_path, :notice =>"Updated!"
    else
        render edit
    end
end

到此:

def update
    @post_to_update = Post.find(params[:id])

    if @post_to_update.update(
                         params[:post].permit(:title, :body, :tag_list, 
                         ## add `:id` to this one   
                         links_attributes:[:id, :link, :_destroy])
                         ##
                         )
        redirect_to posts_path, :notice =>"Updated!"
    else
        render edit
    end
end

您必须在id参数中允许links_attributes,以便记录不会重复并且_destroy能够正常工作