【发布时间】:2019-03-11 02:41:53
【问题描述】:
为什么会出现此错误?我该如何解决?
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(名称)
模型 = self.class.form_structure.select { |记录|记录[:name] == 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
【问题讨论】:
-
您的
@form_structure变量现在无法从您的MyFormObject实例方法访问,这就是为什么在调用它时它返回 nil。如果内容始终是“常量”,您可以使用“常量”,否则您可以创建一个返回该内容的方法。还有其他类型的变量可以从任何实例方法访问,但不鼓励使用它们。 -
所以你建议使用常量?我还有哪些其他选择?
标签: ruby-on-rails ruby ruby-on-rails-5.2