在Rails 4应用程序中,我使用Select 2 v4.0来显示一个预先输入样式的选择字段。 Select2从应用程序中的ajax调用生成json API的选项。
这很有效。
我现在想要允许用户创建一个新项目,如果他们的条目在json中不存在。
这很容易在客户端设置
$('.my-field').select2
tags: true
但是在服务器上处理这个问题的最佳方法是什么?
我原来的想法是,如果选择了现有选项,表单将返回一个ID整数,而如果选择了一个新项,则返回一个字符串。然后,我可以在控制器创建方法
中调用setter方法def create
@object = Object.build(params)
if params[:my_field_id].respond_to?(:to_str)
@object.setter_method = params[:my_field_id]
params[:my_field_id] = nil
end
..
end
但是,当然甚至ID都被视为params中的字符串。
接下来我想我可以修改字符串,以便区分新项目。 Select2使这相对容易。
$('.my-field').select2
tags: true
createTag: (tag) ->
{
id: '<<<<' + tag.term + '>>>>'
text: tag.term
}
然后在控制器中我可以做类似
的事情def create
@object = Object.build(params)
regex = my_regex_pattern
if params[:my_field_id].gsub(regex)
term = params[:my_field_id].slice('<<<<').slice('>>>>')
@object.setter_method = term
params[:my_field_id] = nil
end
...
end
所以我的问题:
my_regex_pattern
与<<<<a
random string of text>>>>
匹配的信息。slice
方法是删除这些额外内容的最佳方法吗?
子?修改
经过一段时间的播放后,slice
似乎可以改进如下:
term = params[:my_field_id].reverse.chomp('<<<<').reverse.chomp('>>>>')
有点笨拙而且不是最好的可读性。还有更好的方法吗?