为什么 Rails 中的强参数顺序很重要?
Why does strong params order in Rails matter?
在我的 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
错误:
syntax error, unexpected ',', 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
这不是强参数的问题,而是 Ruby 如何解析方法签名和哈希值的问题。抽象一点你的第一个例子是这样的:
some_method(arg1, arg2, key1: val1, key2: val2)
Ruby 将识别隐式 trailing 散列并在内部将其表示为:
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 都将被视为参数、散列、参数、散列并且能够处理。
在我的 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
错误:
syntax error, unexpected ',', 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
这不是强参数的问题,而是 Ruby 如何解析方法签名和哈希值的问题。抽象一点你的第一个例子是这样的:
some_method(arg1, arg2, key1: val1, key2: val2)
Ruby 将识别隐式 trailing 散列并在内部将其表示为:
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 都将被视为参数、散列、参数、散列并且能够处理。