错误(私有方法"选择"调用 nil:NilClass):



为什么我会遇到此错误?我该如何修复?

ActionView :: Template ::错误(私有方法``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 {|记录|记录[:name] ==名称} .first [:model] 结束

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

imho,常数是处理该数组的好方法,并充满了硬编码值,仅包含两个元素。

因此,您可以做类似:

的事情
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范围内使用。

我删除了模型本地变量分配,因为它没有使用。

您可以尝试这样的尝试使执行一点轻松执行,

  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放在私有范围中。

相关内容

最新更新