2013-11-01 99 views
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(', ') %> 

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

回答

1

这是因为param [:tag_list]由Rails转换为Array,因此不是由acts_as_taggable_on预期的。

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

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

新的铁路和不太确定这将看起来在控制器。我用现在的控制器编辑了这个问题。谢谢! – user2759575

0

测试的形式,它为我工作。不知道ActsAsTaggableOn是否会将一个数组而不是一个字符串转换为tag_list,但它似乎很好地解析它。

你的参数在提交时看起来是否正确? IE:

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

是的,参数看起来就像那样。嗯。 – user2759575

+0

您可以发布您的整个控制器和相关视图吗?任何在您的服务器日志中没有任何可疑的提交? –

+0

在问题中发布了视图。这里是服务器日志:参数:{“utf8”=>“✓”,“authenticity_token”=> blahblah“=”,“post”=> {“title”=>“test”,“country”=>“”, “description”=>“test”,“tag_list”=> [“sports”],“image_remote_url”=>“”},“commit”=>“添加事件”}。至于整个帖子#索引功能的控制器。如果这有什么不同,这个视图在帖子索引页面调用的部分内容中。 – user2759575

3

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

假设你的模式是 “邮报”,添加这个方法到您的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 

而在职位/ _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

我喜欢这种方法。我最终为my:create::edit操作设置了'before_action'来设置一个用于存储集合数组的变量。谢谢您的帮助! – daveomcd

0

我知道它已经有一段时间,但我最近遇到了同样的问题,并认为我会发布我的解决方案。使用Rails 5.0.0和acts-as-taggable-on我有完全相同的问题:使用f.text_field时,所有标记和标记都会很好地保存,但只要将f.check_box更改为:multiple => true ,没有得到保存。

该解决方案的参数很强。由于提交text_field的参数是这样的:

"blog_post"=>{"tag_list"=>"tech, sports"} 

,而params通过复选框形式看起来像这样提出的:

"blog_post"=>{"tag_list"=>["tech", "sports"]} 

那么我们就需要从

编辑我们强烈PARAMS控制器
params.require(:blog_post).permit(:foo, :tag_list) 

params.require(:blog_post).permit(:foo, :tag_list => []) 

以允许获取提交的数组。