Сбой инициализации нового объекта с параметрами без символов - PullRequest
1 голос
/ 06 марта 2019
def initialize(user=nil, attributes={})
      @user = user
      (self.class.car_fields & attributes.keys.map{|i| i.to_sym }).each do |f|
        car[f] =  attributes[f] if attributes.key?(f)
      end
      validate!
    end 

вызов метода

 attributes = { "has_car" => "true", "has_truck" => "true", "has_boat" => "true", "color" => "blue value", "size" => "large value" }
Car.new(user, attributes)

атрибуты не обновляются для проверки в моей модели.

Однако, если я передам хеш со всеми символами, это сработает.

 attributes_symbols = { :has_car => "true", :has_truck => "true", :has_boat => "true", :color => "blue value", :size=> "large value" }

Car.new(user, attributes_symbols)

Почему, когда я передаю символы, моя модель видит поля, но в первом случае она действует так, как если бы поля никогда не передавались?

1 Ответ

1 голос
/ 06 марта 2019

Потому что в

attributes.keys.map{|i| i.to_sym }

Вы сопоставляете каждую клавишу с символом, а затем получаете к ним доступ в attributes как символ, когда они являются строковыми ключами.

Итак, вы делаете что-то вроде:

{ "has_car" => "true", "has_truck" => "true", "has_boat" => "true", ... }[:has_car]
# nil

Возможное решение - создать новую переменную, вызвав with_indifferent_access on attributes:

indifferent_access_attributes = attributes.with_indifferent_access
(self.class.car_fields & indifferent_access_attributes.keys.map(&:to_sym)).each do |field|
  seller[field] = indifferent_access_attributes[field]
end

Еще один способ - определить формат ключей и работать с ним в течение всего процесса. Поэтому не отображайте символы attributes.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...