美好的一天,
我正在尝试使用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)**
一如既往 感谢您的帮助。
答案 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
能够正常工作