Коллекция RABL отображается пустой в шаблоне, но не в контроллере

#ruby-on-rails #json #rabl

#ruby-on-rails #json #rabl

Вопрос:

В настоящее время я использую rabl-rails 0.5.3 и Rails 4.2.6

У меня возникла эта проблема, когда я пытаюсь отобразить коллекцию объектов моего колледжа из метода index контроллера Rails.

Вот упрощенная версия метода index в моем контроллере:

   def index
    @colleges = College.all

    puts @colleges.count

    render 'api/data_bridge/colleges/show'
  end
  

Я вижу ‘100’ для вывода инструкции puts там. Some явно @colleges не является пустым.

Вот шаблон индекса rabl:

 puts "---===========================-"
puts @colleges.inspect
puts "---===========================-"
collection @colleges
  

В выводе моего сервера я вижу, что эти операторы puts выглядят как:

 ---===========================-
nil
---===========================-
  

Когда я сбрасываю @colleges в контроллере, это определенно не nil. Я не могу понять, что произошло с данными между контроллером и шаблоном.

Ответ №1:

Документация в качестве источника для моих утверждений: https://github.com/ccocchi/rabl-rails#overview

Ваш файл rabl должен выглядеть следующим образом:

 puts "---===========================-"
puts :@colleges.inspect
puts "---===========================-"
collection :@colleges
  

Это был их пример:

 # app/views/post/index.rabl
collection :@posts
attributes :id, :title, :subject
child(:user) { attributes :full_name }
node(:read) { |post| post.read_by?(@user) }
  

Обратите пристальное внимание на «:» перед символом. Вот почему:

Факт компиляции шаблона вне какого-либо контекста рендеринга не позволяет нам использовать какие-либо переменные экземпляров (за исключением node) в шаблоне, потому что они являются объектами рендеринга. Поэтому вместо этого вам придется использовать символы этих переменных.Например, чтобы отобразить коллекцию @posts внутри вашего PostController, вам нужно использовать :@posts внутри шаблона.

Комментарии:

1. отлично. Это приблизило меня на шаг. Теперь я получаю сообщение об ошибке «Неизвестный первичный ключ для table college в model College». Первичным ключом в этой модели является ‘college_id’ вместо ‘id’. Я попытался указать set_primary_key = 'college_id' в модели, но в любом случае выдает ту же ошибку

2. Пожалуйста, отметьте это как решенное, если я решил вашу исходную проблему! Вы действительно должны просто придерживаться соглашения. Не переопределяйте это в модели. Создайте миграцию rails g migration AddPrimaryKeyToColleges id:primary_key . Затем запустите rails db:migrate . Если вы не хотите переносить, вам нужно использовать правильный синтаксис: self.primary_key = "college_id"

3. изменение основного идентификатора столбца не в моих силах. Это то, что было реализовано до моего прибытия, и на чем непреклонно настаивает большая часть команды, в которой я работаю. Фактически, учитывая задачу, которую я выполняю, я ничего не могу изменить в базе данных — я просто читаю из нее. Я отмечу это как решенное. Просто пытаюсь удержаться от открытия другого вопроса…