13

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

我有一个名为 Hstore 的列:content,我想用它来存储多种语言的内容,: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!

这当然有效。

4

3 回答 3

15

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

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

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

于 2013-07-02T17:06:51.803 回答
2

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

假设一个名为Article您的模型可以访问您的:content索引stored_attributes,如下所示:Article.stored_attributes[:content]

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

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

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

于 2014-03-22T12:23:34.910 回答
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
于 2014-12-04T00:26:32.607 回答