代码之家  ›  专栏  ›  技术社区  ›  Augusto Carmo

为什么强参数在Rails中的顺序很重要?

  •  2
  • Augusto Carmo  · 技术社区  · 8 年前

    在我的 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
    

    错误:

    语法错误,意外“,”,应为=>…,:name],:product_category_id,attr_val_id:[])…^

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


    产品型号.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
    

    产品类别.rb

    class ProductCategory < ApplicationRecord
      validates :name, presence: true
      validates :name, uniqueness: true
    
      has_many :product_models
    end
    
    1 回复  |  直到 8 年前
        1
  •  4
  •   Philip Hallstrom    8 年前

    这不是强参数的问题,而是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)
    

    鲁比不知道该怎么办。它使 key2 参数变为散列,但随后留下一个参数、看起来像命名参数的参数和一个参数。但它不喜欢那样。

    您可以通过这样做来修复它:

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

    甚至这个:

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

    这两个Ruby都将看到参数、散列、参数、散列,并且能够进行处理。