rails 4强参数+动态hstore键

时间:2013-06-27 16:40:58

标签: ruby-on-rails ruby-on-rails-4 hstore strong-parameters

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

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

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

如何在rails 4中为一列覆盖强参数(或允许动态hstore密钥)?

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

缺少......

params.require(:article).permit!

当然可行。

3 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:2)

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

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

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

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

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

答案 2 :(得分:0)

正如人们所说,仅允许:内容参数是不够的 - 您还需要允许哈希中的密钥。保持政策,我这样做:

  # 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