【问题标题】:rails 4 strong params + dynamic hstore keysrails 4 strong params + 动态 hstore 键
【发布时间】:2013-06-27 16:40:58
【问题描述】:

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

我有一个名为 :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!

当然可以。

【问题讨论】:

  • 这个动态 hstore 数据的布局如何?

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


【解决方案1】:

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

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

这对我有用,希望对你有帮助!

【讨论】:

【解决方案2】:

我正在做类似的事情,发现这更清洁并且运行良好。

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

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

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

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

【讨论】:

    【解决方案3】:

    正如人们所说,仅允许 :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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多