Ошибка (закрытый метод `select 'вызван для nil: NilClass): - PullRequest
0 голосов
/ 11 марта 2019

Почему я получаю эту ошибку?Как это исправить?

ActionView :: Template :: Error (закрытый метод `select 'вызывается для nil: NilClass):

class MyformObject

  include ActiveModel::Model

  #validations


@form_structure =
  [
    {  name: :country, model: :car, field_type: :string },
    {  name: :street, model: :repair_center, field_type: :string }
  ]

  def get_model_from_name(name)
    model = @form_structure.select { |record| record[:name] == name }.first[:model]
  end  

  def type_for_attribute(name)
    get_model_from_name(name).to_s.capitalize.constantize.type_for_attribute
  end 

  def has_attribute?(name)
    get_model_from_name(name).to_s.capitalize.constantize.attributes.key?(name.to_s)
   end

def self.fields_of_model(model)
  form_structure.select { |record| record[:model] == model }.map { |record| record[:name] }
end

 end

ОБНОВЛЕННАЯ ВЕРСИЯ:

ОШИБКА: неопределенный метод `[] 'для nil: NilClass def get_model_from_name (name)
model = self.class.form_structure.select {| record |запись [: имя] == имя} .first [: модель] конец

class MyformObject

  include ActiveModel::Model

  #validations


def self.form_structure 
  [
    {  name: :country, model: :car, field_type: :string },
    {  name: :street, model: :repair_center, field_type: :string }
  ]
end

  def get_model_from_name(name)
    model = self.class.form_structure.select { |record| record[:name] == name }.first[:model]
  end  

  def type_for_attribute(name)
    get_model_from_name(name).to_s.capitalize.constantize.type_for_attribute
  end 

  def has_attribute?(name)
    get_model_from_name(name).to_s.capitalize.constantize.attributes.key?(name.to_s)
   end

def self.fields_of_model(model)
  form_structure.select { |record| record[:model] == model }.map { |record| record[:name] }
end

def self.delegate_fields_to(*models)
      models.each do |model|
        fields_of_model(model).each do |attr|
          delegate attr.to_sym, "#{attr}=".to_sym, to: model
        end
      end
    end

 end

Ответы [ 2 ]

3 голосов
/ 11 марта 2019

ИМХО, константа - это хороший способ обработки этого массива, так как он полон жестко закодированных значений и содержит всего два элемента.

Так что вы можете сделать что-то вроде:

class MyformObject
  FORM_STRUCTURE = [
    { name: :country, model: :car, field_type: :string },
    { nname: :street, model: :repair_center, field_type: :string }
  ].freeze
  private_constant :FORM_STRUCTURE

  def get_model_from_name(name)
    FORM_STRUCTURE.select { |record| record[:name] == name }.first[:name]
  end 
end

p MyformObject.new.get_model_from_name(:country)
# [:country]

Там вы видите, что константа не может быть изменена и используется только в области действия MyformObject.

Я удалил локальную переменную модели, так как она не используется.

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

Вы можете попробовать вот так, что немного облегчает выполнение,

  def get_model_from_name(name)
    model = form_structure.select { |record| record[:name] == name }.first[:model]
  end

  def form_structure
    [
      {  name: :country, model: :car, field_type: :string },
      {  name: :street, model: :repair_center, field_type: :string }
    ]
  end

А для лучшей инкапсуляции вы можете поместить метод form_structure в приватную область.

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