为什么Rails中强大的params命令很重要?

时间:2018-05-20 16:09:55

标签: ruby-on-rails forms nested-forms strong-parameters nested-form-for

在我的product_model_controller.rb中,我有以下强力参数代码:

  def product_model_params
    params.require(:product_model)
          .permit(:name, :product_category_id, 
                  product_category_attributes: [:id, :name], attr_val_ids: [])
  end

就目前而言,它运作良好。但是,如果我改变了参数的顺序,它就会停止工作。例如:

  def product_model_params
    params.require(:product_model)
          .permit(:name, product_category_attributes: [:id, :name],
                  :product_category_id, attr_val_ids: [])
  end

错误:

  

语法错误,意外',',expecting => ...,:name],:product_category_id,attr_val_ids:[])... ^

为什么会这样?我已经被困了很长时间了:/

product_model.rb

class ProductModel < ApplicationRecord
  validates :name, presence: true
  validates :name, uniqueness: true

  has_many :products
  has_many :product_model_attr_vals
  has_many :attr_vals, through: :product_model_attr_vals
  has_many :attrs, through: :attr_vals

  belongs_to :product_category

  accepts_nested_attributes_for :product_model_attr_vals
  accepts_nested_attributes_for :product_category
end

product_category.rb

class ProductCategory < ApplicationRecord
  validates :name, presence: true
  validates :name, uniqueness: true

  has_many :product_models
end

1 个答案:

答案 0 :(得分:4)

这不是强params的问题,而是Ruby如何分析方法签名和哈希。抽出一点你的第一个例子是:

some_method(arg1, arg2, key1: val1, key2: val2)

Ruby将识别出隐含的尾随哈希,并在内部将其表示为:

some_method(arg1, arg2, {key1: val1, key2: val2})

适用于像哈希一样的最正确的参数。在你的第二个例子中,你已经完成了这个:

some_method(arg1, key1: val1, arg2, key2: val2)

Ruby不知道如何处理它。它将key2参数转换为哈希值,但随后留下一个参数,看起来像命名参数和参数。而且它不喜欢那样。

你可以通过这样做来解决它:

some_method(arg1, {key1: val1}, arg2, key2: val2)

甚至这个:

some_method(arg1, {key1: val1}, arg2, {key2: val2})

Ruby都会将其视为参数,哈希,参数,哈希并且能够处理。