我使用acts_as_taggable_on
做标签,和simple_form
+select2
做标签的输入。表单的代码片段为:
<%=
f.input :category_list,
label: false,
collection: @article.categories.map { |t| t.name }
%>
select2
调用如下:
$('#article_category_list').select2
tags: true
multiple: true
在输入时显示有两个标签:
当保存按钮被点击时,打印select
元素的值:
保存后却只显示最后一个标签:
请问该如何解决呢?
更新 1: 忘记贴相关日志了:
Started PATCH "/users/1/articles/1" for 127.0.0.1 at 2015-08-11 22:55:17 +0800
Processing by ArticlesController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"BlU5N1JObvkG6dhL0r98p1ejms0CmdifwFF9FZYuO5/bvsCNNTonhhldhFro94kKqn0KleOjN3VqB9kvWF20pg==", "article"=>{"user_id"=>"1", "title"=>"云滴谱的数值求解", "category_list"=>"第二个标签", "privacy"=>"0", "group_ids"=>[""], "content"=>"\\\\[ \\frac{\\partial n}{\\partial t} = - \\frac{\\partial}{\\partial r} \\frac{d r}{d t} n \\\\]"}, "commit"=>"修改", "user_id"=>"1", "id"=>"1"}
可见category_list
中只有第二个标签
。
更新 2: 我将表单输入改为如下形式有效果:
<%=
f.text_field :category_list,
label: false
%>
Started PATCH "/users/1/articles/1" for 127.0.0.1 at 2015-08-12 08:01:01 +0800
Processing by ArticlesController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"RCYsujn6X6taCRUqJLUUUITQOY1HmrJ9DVyz6HtylUA7GFwD/XoHU1MSuDiNrLDO8u+TjooSssmqy3GFuvKdOQ==", "article"=>{"user_id"=>"1", "title"=>"云滴谱的数值求解", "category_list"=>"第二个标记,第三个标记", "privacy"=>"0", "group_ids"=>[""], "content"=>"\\\\[ \\frac{\\partial n}{\\partial t} = - \\frac{\\partial}{\\partial r} \\frac{d r}{d t} n \\\\]"}, "commit"=>"修改", "user_id"=>"1", "id"=>"1"}
但是表单输入没有select2
那样的分块:
最接近的一个例子在这里,但是该方法似乎不管用了。
经过折腾(debugger),终于大概搞清楚问题所在。首先说在更新 2 中,使用了text_field
,此时从表单传回的category_list
是一个字符串,所以在强参数处无需说明category_list
是一个数组,方法有效,但是输入时没有select2
那种分块的好看,因此废弃。在最开始的方法中,使用了select
元素,传回的是数组,因此需要说明category_list
是一个数组:
params.require(:article).permit(..., { category_list: [] }, ...)
其次还需要在表单中显式支持multiple: 'multiple'
(正如@_kaichen支持的,但是写multiple: true
无效):
<%=
f.input :category_list,
label: false,
collection: @article.categories.map { |t| t.name },
include_blank: false,
input_html: {
multiple: 'multiple' # <---------- 这个一定要加
}
%>
否则就只会传回最后一个标签了。问题最终看来很简单,但是对于新手一开始还是有点摸不着头脑。
非常感谢各位的帮助!