Почему важен порядок сильных параметров в Rails? - PullRequest
0 голосов
/ 20 мая 2018

В моем 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

Ошибка:

синтаксическая ошибка, неожиданный ',', ожидание => ...,: имя],: 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 голосов
/ 20 мая 2018

Проблема не в сильных параметрах, а в том, как Ruby анализирует сигнатуры и хэши методов.Немного абстрагирован ваш первый пример:

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

Ruby распознает неявный конечный хэш и внутренне представит его следующим образом:

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

This only работает для большинства правых аргументов, подобных хешу.Во втором примере вы сделали это:

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в качестве аргумента хэш, аргумент, хэш и может обрабатывать.

...