Проблема Ruby on Rails to_json с: include - PullRequest
10 голосов
/ 18 декабря 2009

У меня есть следующий код

@asset = Asset.first(
  :include => [
    :asset_statuses => [
      :asset_status_name, 
      {:asset_location => [
        {:asset_floor => :asset_building}
      ]}
    ],
    :asset_type => [
      :asset_category => :asset_department
    ]
  ],

(вероятно, не лучший дизайн таблицы БД, но это то, что я должен использовать)

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; Я не понимаю, почему это не работает.

Ответы [ 4 ]

23 голосов
/ 10 января 2010

В случае, если у кого-то еще возникнет странная проблема, с которой я столкнулся ... to_json также вернет эту ошибку при попытке включить ассоциацию, которая не определена в модели.

8 голосов
/ 18 декабря 2009

Я думаю, что синтаксис to_json: include немного отличается.

Я обычно делаю

@asset.to_json(:include => { :asset_statuses => {
                             :include => :asset_status_name}})

(и начните с малого, затем добавьте все остальные вещи. Раздражающая схема!)

7 голосов
/ 31 октября 2011

Я получил эту ошибку при попытке смешать отношения 1-го и 2-го порядка в одном вызове to_json. Вот что у меня изначально было:

render :json => @reports.to_json(:include => 
   [:report_type, :organisation, :analysis => {:include => :upload}]

, которое выдает исключение "неопределенный метод` macro 'для nil: NilClass "выше.

Вот как я это исправил:

render :json => @reports.to_json(:include => 
   {:report_type => {}, :organisation => {}, 
    :analysis => {:include => {:upload => {}}}})

Массив будет работать для отношений одного порядка, но для отношений второго порядка содержащийся объект должен быть хешем.

2 голосов
/ 27 мая 2011

У меня была эта проблема, когда я переопределил функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...