通过复选框添加标签

时间:2013-11-01 20:57:33

标签: ruby-on-rails ruby-on-rails-4 acts-as-taggable-on

我正在尝试通过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(', ') %>

问题是,当我点击一个复选框时,它不会将该标签保存到帖子中。如果我使用标准的'添加你自己的标签,用逗号分隔',一切都有效。

4 个答案:

答案 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 => [])

允许提交的数组。