1

我正在尝试通过 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

4 回答 4

3

我正在使用强大的参数,所以我做了以下事情。

假设您的模型是“Post”,将此方法添加到您的 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'}
于 2015-03-22T22:24:50.313 回答
1

这是因为 param[:tag_list] 被 Rails 转换为数组,因此不是acts_as_taggable_on 所期望的。

我怀疑在控制器中执行以下操作(在更新/创建它之前)可能会解决问题:

  params[:tag_list] = params[:tag_list].join(", ")
于 2013-11-01T21:57:15.860 回答
0

测试了该表格,它对我有用。不确定 ActsAsTaggableOn 是否会将数组而不是字符串放入 tag_list 中,但它似乎可以很好地解析它。

您的参数在提交时看起来正确吗?IE:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"blargh", "blog_post"=>{"tag_list"=>["tech", "sports"]}, "commit"=>"Update BlogPost", "id"=>"1"}
于 2013-11-01T22:04:36.063 回答
0

我知道已经有一段时间了,但我最近遇到了同样的问题,并认为我会发布我的解决方案。使用 Rails 5.0.0 并作为可标记操作我遇到了完全相同的问题:当使用 f.text_field 时,所有标签和标记都得到很好的保存,但是一旦我使用 :multiple => true 更改为 f.check_box ,什么都没有保存。

解决方案是强参数。因为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 => [])

允许提交的数组。

于 2016-08-05T05:23:52.990 回答