我正在尝试通过simple_form复选框和acts_as_taggable_on gem为帖子添加标签。已经有一些问题,但我还没有找到一个有效的方法。我想要以下标签选项:世界,政治,科技和体育。
现在我在_form中有这个:
<%= f.label :tag_list %>
<%= f.check_box :tag_list, { :multiple => true }, 'world', nil %>
<%= f.check_box :tag_list, { :multiple => true }, 'politics', nil %>
<%= f.check_box :tag_list, { :multiple => true }, 'tech', nil %>
<%= f.check_box :tag_list, { :multiple => true }, 'sports', nil %>
我在帖子模型中有这个:
acts_as_taggable
这是控制器:
def index
if params[:tag]
@posts = Post.tagged_with(params[:tag])
else
@posts = Post.all
end
end
和视图:
<%= raw post.tag_list.map { |t| link_to t, tag_path(t) }.join(', ') %>
问题是,当我点击一个复选框时,它不会将该标签保存到帖子中。如果我使用标准的'添加你自己的标签,用逗号分隔',一切都有效。
答案 0 :(得分:3)
我正在使用强参数,所以我做了以下内容。
假设您的模型是&#34;发布&#34;,请将此方法添加到您的posts_controller.rb文件中
def create
params[:post][:tag_list] = params[:post][:tag_list].join(',')
@post = Post.new(post_params)
@post.save
end
private
def post_params
params.require(:post).permit(:title, :content, :tag_list)
end
在posts / _form.html.haml
中= simple_form_for post, remote: true do |f|
= f.error_notification
= f.input :title
= f.input :content
= f.input :tag_list, as: :check_boxes, collection: ['tag1', 'tag2', 'tag3']
= f.submit class: 'btn btn-primary'
= link_to "Cancel", "#", class: 'btn', data: {dismiss: 'modal'}
答案 1 :(得分:1)
这是因为param [:tag_list]被Rails转换为Array,因此不是acts_as_taggable_on所期望的。
我怀疑在控制器中执行以下操作(更新/创建之前)可能会解决问题:
params[:tag_list] = params[:tag_list].join(", ")
答案 2 :(得分:0)
测试了那个表格,它对我有用。不确定ActsAsTaggableOn是否会将数组而不是字符串带入tag_list,但似乎解析它很好。
提交时你的参数是否正确? IE:
Parameters: {"utf8"=>"✓", "authenticity_token"=>"blargh", "blog_post"=>{"tag_list"=>["tech", "sports"]}, "commit"=>"Update BlogPost", "id"=>"1"}
答案 3 :(得分:0)
我知道它已经有一段时间了,但我最近遇到了同样的问题并且认为我发布了我的解决方案。使用Rails 5.0.0和act-as-taggable-on我有完全相同的问题:当使用f.text_field时,所有标签和标签都得到了很好的保存,但是一旦我改为f.check_box:multiple =&gt;没错,什么都没有保存。
解决方案的参数很强。因为text_field提交的参数如下所示:
"blog_post"=>{"tag_list"=>"tech, sports"}
和复选框表单提交的参数如下所示:
"blog_post"=>{"tag_list"=>["tech", "sports"]}
然后我们需要在
中编辑控制器中的强参数params.require(:blog_post).permit(:foo, :tag_list)
到
params.require(:blog_post).permit(:foo, :tag_list => [])
允许提交的数组。