【问题标题】:Adding tags through checkboxes通过复选框添加标签
【发布时间】:2013-11-01 20:57:32
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我正在使用强参数,所以我做了以下操作。

    假设您的模型是“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'}
    

    【讨论】:

    • 我喜欢这种方法。我最终为我的 :create, :edit 操作设置了一个“before_action”,以设置一个变量来存储集合数组。感谢您的帮助!
    【解决方案2】:

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

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

      params[:tag_list] = params[:tag_list].join(", ")
    

    【讨论】:

    • Rails 新手,不太确定它在控制器中的外观。我用我的控制器现在编辑了这个问题。谢谢!
    【解决方案3】:

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

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

    Parameters: {"utf8"=>"✓", "authenticity_token"=>"blargh", "blog_post"=>{"tag_list"=>["tech", "sports"]}, "commit"=>"Update BlogPost", "id"=>"1"}
    

    【讨论】:

    • 是的,参数看起来就是这样。嗯。
    • 你能发布你的整个控制器和相关视图吗?您的服务器日志中围绕提交是否有任何可疑之处?
    • 在问题中发布了视图。这是服务器日志:参数:{"utf8"=>"✓", "authenticity_token"=>blahblah"=", "post"=>{"title"=>"test", "country"=>"", "description"=>"test", "tag_list"=>["sports"], "image_remote_url"=>""}, "commit"=>"Add Event"}。至于控制器,它就是整个 posts#index 函数。如果有任何区别,该视图位于帖子索引页面调用的部分中。
    • 你的#update 呢?之后你看到提交事务到数据库了吗?没有回滚?在 Rails 控制台中调用该对象时会发生什么?如果您设置了标记路由,该视图应该可以工作。
    【解决方案4】:

    我知道这已经有一段时间了,但我最近遇到了同样的问题,并认为我会发布我的解决方案。使用 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 => [])
    

    允许提交的数组。

    【讨论】:

      猜你喜欢
      • 2012-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-11
      • 2021-10-25
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      相关资源
      最近更新 更多