Rails 4强参数+动态Hstore键

13

我在使用Hstore和动态访问器时,在Rails 4中克服新的strong params要求方面遇到了问题。

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

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

我该如何在Rails 4中覆盖Strong Params(或允许动态Hstore键)以针对一个列?
  params.require(:article).permit(
    :name, :content,
    :en, :fr #+226 random translations
  )

缺少足够的IT资源?

params.require(:article).permit!

当然是有效的。

这个动态hstore数据的布局是什么样子? - parzival
3个回答

17

如果我理解正确,您想要将动态密钥的哈希列入白名单。您可以使用以下 ruby 代码来实现:

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

这对我有用,希望能帮到你!


1
如何允许任何一组键,而不是白名单。例如,如果我想允许用户创建自己的键名:这是我的问题:https://dev59.com/fnfZa4cB1Zd3GeqPQVnq - Joel Grannas

2

我正在做类似的事情,发现这种方法更简洁且有效。

假设有一个名为Article的模型,您可以像这样访问您的:content索引的stored_attributesArticle.stored_attributes[:content]

因此,您的强参数看起来像这样:

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

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

0

正如人们所说,仅允许 :content 参数是不够的 - 你还需要允许哈希中的键。为了保持政策的一致性,我这样做:

  # 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接