嵌套属性id数组语法问题

时间:2019-05-31 17:50:09

标签: ruby-on-rails ruby-on-rails-5

因此,rails 5中有正在工作的部分代码。我正在制作具有多层嵌套属性的大型表单。我有一个强大的参数列表:

params.require(:lexeme).permit(
    :word, :homonym_number, :see_other_lexeme_id, :semantic_description, :afterword,
    variants_attributes: [ :word, :id, :_destroy, proofs_attributes: [ :word, :language_id, :meaning, :id, :_destroy, language_mode_ids: [] ] ]
  )

当我尝试更改订单时...

params.require(:lexeme).permit(
    :word, :homonym_number, :see_other_lexeme_id, :semantic_description, :afterword,
    variants_attributes: [ :word, :id, :_destroy, proofs_attributes: [ :word, :language_id, :meaning, :id, language_mode_ids: [], :_destroy ] ]
  )

我得到:

syntax error, unexpected ']', expecting =>
...guage_mode_ids: [], :_destroy ] ]
...                              ^):

所以,Rails大师,这里的这种简单语法有什么问题,总是需要将数组参数放在最后吗?如果我在参数中有更多数组怎么办?

1 个答案:

答案 0 :(得分:1)

问题是,根据语法糖词汇分析,最后一个:_destroy应该是key => value

如果要保留新订单,则需要像这样将language_mode_ids: []设为文字Hash

params.require(:lexeme).permit(
  :word, :homonym_number, :see_other_lexeme_id, :semantic_description, :afterword,
  variants_attributes: [ :word, :id, :_destroy, 
    proofs_attributes: [ 
      :word, :language_id, :meaning, :id, {language_mode_ids: []}, :_destroy 
    ] 
  ]
)

Ruby试图通过允许您指定language_mode_ids: []来帮助您,但是它将要求其右侧的所有参数也代表一个键值对。

由于:_destroy只是一个符号,解释器不知道如何处理。这就是为什么您的第一笔订单有效而新的订单无效的原因。