这个问题在SO上被问过很多次。主要问题是没有什么适合我的情况。
在这种情况下,我无法将键入的内容作为数组存储在数据库列中。
文本字段,其代码为:
= text_field_tag 'product[keywords][]', @product.keywords, class: 'tab-input
product_keywords'
在控制器中,强参数是:
params.require(:product).permit(:id, :name, :keywords => [])
jQuery代码在输入错误值时不会在删除时删除值,但由于我想在一行中输入逗号分隔的值,因此会在每个元素后添加逗号。
$(document).on 'keyup', '.product_keywords', ->
keyword = @value.replace(/(\w)[\s,]+(\w?)/g, '$1, $2')
if keyword != @value
@value = keyword
return
型号代码:
serialize :keywords, Array
迁移代码:
class AddKeywordsToProducts < ActiveRecord::Migration[5.1]
def change
add_column :products, :keywords, :text
end
end
因此,如果有人写作,请abc并按空格,最后会添加一个逗号。在三个键入的单词之后,它将看起来像:
abc, dbx, she
现在我想将其存储为列中的数组,但存储不正确。 它存储为:
["abc, dbx, she"]
也请有人告诉我处理这些案件的最佳方案吗? 加上使用红宝石处理此类案件的最佳实践,以便将来我会学习吗?
答案 0 :(得分:1)
您可能希望使用here所示的自定义序列化程序。所以代替:
serialize :keywords, Array
您可能会做些类似的事情:
serialize :keywords, KeywordSerializer
在helpers
中的某个地方:
class KeywordSerializer
def self.dump(what)
what.join(", ")
end
def self.load(what)
what.split(/\s*,\s*/)
end
end
答案 1 :(得分:0)
使用单一表单标签传递数组元素不能作为数组传递,而不能将数组作为字符串传递,您需要在将参数列入白名单的附近对其进行处理,
permitted_params = params.require(:product).permit(:id, :name, :keywords => [])
permitted_params[:keywords] = permitted_params[:keywords][0].split(/\s*,\s*/)