rails 4强参数+动态hstore键

我在使用Hstore和动态访问器克服Rails 4中新的强params需求时遇到了问题

我有一个Hstore列,名为:content ,我想用它来存储多种语言的内容,即:en, :fr等。我不知道在模型或控制器中预先设置哪种语言。

 store_accessor :content, [:en, :fr] #+226 random other il8n languages won't work. 

如何在rails 4中为一列覆盖强params(或允许动态hstore键)?

  params.require(:article).permit( :name, :content, :en, :fr #+226 random translations ) 

缺乏…

 params.require(:article).permit! 

这当然有效。

如果我理解正确,您希望将动态密钥的哈希列入白名单。 您可以按如下方式使用一些ruby代码来执行此操作:

 params.require(:article).permit(:name).tap do |whitelisted| whitelisted[:content] = params[:article][:content] end 

这对我有用,希望它有所帮助!

我正在做类似的事情,发现这有点干净,效果很好。

假设一个名为Article的模型,你可以像这样访问你的:content indexed stored_attributesstored_attributes Article.stored_attributes[:content]

所以你强大的params看起来像这样:

 params.require(:article).permit(:name, content: Article.stored_attributes[:content]) 

假设您的参数结构如下:{article => {name:“”,content:[en,fr,..]}}

正如人们所说,仅允许:content param是不够的 – 你还需要允许哈希中的键。 保持政策,我这样做:

  # in controller... def model_params params.permit(*@policy.permitted_params(params)) end # in policy... def permitted_params(in_params = {}) params = [] params << :foo params << :bar # ghetto hack support to get permitted params to handle hashes with keys or without if in_params.has_key?(:content) content = in_params[:content] params << { :content => content.empty? ? {} : content.keys } end end