Ответ 1
В случае, если кто-то другой сталкивается с проблемой, связанной с причудливой проблемой, которую я сделал... to_json
также вернет эту ошибку, когда вы попытаетесь включить ассоциацию, которая не определена в модели.
У меня есть следующий код
@asset = Asset.first(
:include => [
:asset_statuses => [
:asset_status_name,
{:asset_location => [
{:asset_floor => :asset_building}
]}
],
:asset_type => [
:asset_category => :asset_department
]
],
(возможно, не лучшая таблица DB, но то, что я должен использовать)
Asset.first
работает правильно, и он возвращает данные правильно, но когда я пытаюсь использовать один и тот же :include
в методе to_json
, он терпит неудачу с следующей ошибкой:
@asset.to_json(
:include => [
:asset_statuses => [
:asset_status_name,
{:asset_location => [
{:asset_floor => :asset_building}
]}
],
:asset_type => [
:asset_category => :asset_department]
]
)
NoMethodError (undefined method `macro' for nil:NilClass):
Метод to_json
имеет тот же синтаксис :include
, что и find; Я не понимаю, почему он не работает.
В случае, если кто-то другой сталкивается с проблемой, связанной с причудливой проблемой, которую я сделал... to_json
также вернет эту ошибку, когда вы попытаетесь включить ассоциацию, которая не определена в модели.
Я думаю, что синтаксис to_json
: include немного отличается.
Я обычно делаю
@asset.to_json(:include => { :asset_statuses => {
:include => :asset_status_name}})
(и начните с маленького, а затем добавьте все другие вещи. раздражающая схема!)
Я получил эту ошибку при попытке смешать отношения 1-го и 2-го порядка в одном вызове to_json. Вот что я изначально имел:
render :json => @reports.to_json(:include =>
[:report_type, :organisation, :analysis => {:include => :upload}]
который выдает метод undefined `macro 'для исключения nil: NilClass выше.
Вот как я его исправил:
render :json => @reports.to_json(:include =>
{:report_type => {}, :organisation => {},
:analysis => {:include => {:upload => {}}}})
Массив будет работать для отношений одного порядка, но для отношений второго порядка содержащий объект должен быть хешем.
У меня была эта проблема, когда я переопределил функцию as_json
def as_json(options={})
if options[:admin]
super(:methods => [:url_thumb] )
else
super(options.merge( :only => :id ))
end
end
по какой-то причине, когда вы вызываете as_json или to_json в массиве без аргументов, параметры стали nil.
Исправление:
def as_json(options={})
options = {} if options.nil?
if options[:admin]
super(:methods => [:url_thumb] )
else
super(options.merge( :only => :id ))
end
end