如何使用Rails Action Controller嵌套参数来允许特定属性哈希

rea*_*not 4 hash ruby-on-rails actioncontroller strong-parameters

关于嵌套参数有很多问题,但我似乎无法找到解决我特定的简单情况的问题.

我正在尝试允许不是数组的嵌套哈希.我希望这可行:

params.require(:book).permit(:title, :description, style: {:font, :color})
Run Code Online (Sandbox Code Playgroud)

但它导致语法错误.

然而,这有效:

params.require(:book).permit(:title, :description, style: [:font, :color])
Run Code Online (Sandbox Code Playgroud)

但我的问题是,它似乎允许style值为具有属性的项目数组:font和:color.我只想允许具有这两个属性的单个哈希.

我尝试了其他变体,但我不断收到语法错误.我很感激任何帮助.

上下文:Rails 4.1.7,Ruby 2.0.0(它在我的todo列表中进行升级!),而不是使用ActiveRecord.

eze*_*ekg 8

问题是,正如您的错误所述,您有语法错误.这是因为{:font, :color}Ruby无效.您正在尝试将哈希语法{ key: value }与数组语法混合使用[:one, :two].你可能想做的是,

# Accept params: { book: { style: { font: value, color: value } } }
params.require(:book).permit(style: [:font, :color])
Run Code Online (Sandbox Code Playgroud)

要么,

# Accept params: { book: { style: [{ font: value, color: value }] } }
params.require(:book).permit(style: [[:font, :color]])
Run Code Online (Sandbox Code Playgroud)

您使用一组键来接受哈希(而不是数组)的事实就是这样的strong_parameters.要接受一个数组,你实际上只是做这样的事情,

# Accept params: { book: { style: [:font, :color] } }
params.require(:book).permit(style: [])
Run Code Online (Sandbox Code Playgroud)

希望澄清这个问题.


Joe*_*edy 0

我认为如果你用style大括号括起来,它应该可以工作,即:

params.require(:book).permit(:title, :description, { style: [:font, :color] })
Run Code Online (Sandbox Code Playgroud)

  • 重要的是要注意 @ezekg 提到的内容:`{:font, :color}` 不是有效的 ruby​​。一般来说,如果您想要符号数组,请执行“[:font,:color]”。如果您想要键值哈希,请坚持使用大括号,但使用 `{ :key => :value }` 而不是中间的逗号(@readyornot 语法错误的来源)。或者,更好的是,现代语法版本 `{ key: :value }` 实际上是相同的。 (3认同)
  • @GabrielOsorio:你完全正确。我已经修正了我的答案。 (3认同)