Рендеринг URL-адреса Paperclip с использованием JBUILDER

Я создаю API с Ruby on Rails.

У меня есть пользователи, у которых аватары реализованы с помощью скрепки.

Я пытаюсь получить доступ к URL-адресу моей скрепки в моем выводе JSON, и это просто разбило мой экземпляр heroku. Это отлично работает локально.

Фрагмент моей пользовательской модели

class User < ActiveRecord::Base

  has_attached_file :avatar, styles: { large: "600x600#", medium: "300x300#", thumb: "100x100#" }, default_url: "https://s3.amazonaws.com/whiztutor-marketing/photos/Profile300.png"
  validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/

end

Фрагмент моего Jbuilder для моего пользователя

json.cache! @user do
  json.id @user.id
  json.type @user.type
  json.f_name @user.f_name
  json.about @user.about
  json.email @user.email
  json.avatar_url @user.avatar.url(:medium)
  json.referral_code @user.referral_code
  json.education_level @user.education_level
  json.photo_url @user.avatar.to_json
  json.education_details @user.education_details.all
  json.all_subjects @user.subjects.all
  json.all_times @user.all_available_times.each do |time|
    json.day time.schedule.to_s
    json.time_block time.time_as_string
    json.next_occurrence time.schedule.next_occurrence(Time.now)
  end 
end

Я попытался обернуть это в метод, найденный на этот вопрос и точно так же ломает сервер. Я даже могу запустить консоль и получить доступ к этим URL-адресам напрямую с сервера. Что-то с JBUILDER и PAPERCLIP просто не смешивается, и я не могу докопаться до сути. Любая помощь приветствуется.


person JohnSalzarulo    schedule 11.03.2016    source источник
comment
Можете ли вы опубликовать сообщение об ошибке, которое вы видите на Heroku?   -  person Paul A Jungwirth    schedule 13.03.2016
comment
Может возникнуть проблема с конфигурацией учетных данных aws с помощью скрепки на вашем сервере. Не могли бы вы показать нам сообщение об ошибке и трассировку?   -  person Rohit Jangid    schedule 14.03.2016
comment
Я не получаю заметных ошибок в своих журналах. Я знаю, что учетные данные AWS хороши, потому что я могу получить все URL-адреса в своей консоли сервера, а не только в моей локальной консоли. Кроме того, я могу загружать фотографии без ошибок, используя кодировку postman и base64. Все эти изображения не вызывают проблем во внешнем интерфейсе веб-приложения серверного приложения. В частности, это получение URL-адреса для JBUILDER, у которого возникают проблемы.   -  person JohnSalzarulo    schedule 15.03.2016
comment
Консоли и серверная среда совершенно разные. Возможна ситуация, когда сервер Heroku не инициализирует переменные среды. Не могли бы вы упомянуть, где вы храните учетные данные aws. В файле yaml или rb или вы используете ENV?   -  person Rohit Jangid    schedule 15.03.2016
comment
Я сохраняю переменные, используя ENV - я знаю, что они находятся прямо на моем сервере, потому что в консоли моего сервера, а не в LOCALHOST, я могу загружать изображения и возвращать URL-адреса. Живое веб-приложение, работающее под управлением heroku, может без проблем возвращать URL-адреса. Только при попытке отобразить эти URL-адреса в JSON на том же сервере что-то ломается.   -  person JohnSalzarulo    schedule 15.03.2016
comment
Если ошибки нет, почему вы говорите, что у JBUILDER проблемы? Какие проблемы?   -  person Paul A Jungwirth    schedule 16.03.2016
comment
Почтальон говорит, что моя конечная точка heroku выдает ошибку сервера 500. Но журналы моего сервера не показывают проблем.   -  person JohnSalzarulo    schedule 16.03.2016
comment
Журналы сервера от heroku просто читают 2016-03-16T20:41:09.337047+00:00 heroku[router]: at=info method=GET path="/v1/tutors/56" host=whiztutorapi.herokuapp.com request_id=79a0123e-0a16-40ed-85aa-ae75b97f586a fwd="159.83.196.1" dyno=web.1 connect=1ms service=157ms status=500 bytes=330, как будто это успешный GET   -  person JohnSalzarulo    schedule 16.03.2016
comment
Я почти уверен, что это как-то связано с сериализацией скрепки в этом поле аватара.   -  person JohnSalzarulo    schedule 16.03.2016


Ответы (3)


Наконец, диагностировал эту проблему после нескольких часов исследований.

Проблема связана с "json.cache! @user do" - в частности, с .cache! - я хотел сэкономить несколько серверных циклов и ускорить работу, поэтому сначала я реализовал это так.

Несмотря на это, когда я обновил свой код JBUILDER до следующего, я больше не получаю 500 ошибок сервера.

Фрагмент моего рабочего Jbuilder для моего пользователя

json.id @user.id
json.type @user.type
json.f_name @user.f_name
json.about @user.about
json.email @user.email
json.small_photo @user.profile_url_small
json.medium_photo @user.profile_url_medium
json.referral_code @user.referral_code
json.education_level @user.education_level
json.education_details @user.education_details.all
json.all_subjects @user.subjects.all
json.all_times @user.all_available_times.each do |time|
    json.day time.schedule.to_s
    json.time_block time.time_as_string
  json.next_occurrence time.schedule.next_occurrence(Time.now)
end 
person JohnSalzarulo    schedule 16.03.2016

Трудно сказать, в чем может быть проблема, не зная ошибки, но эти вещи выглядят подозрительно или просто неправильно:

json.avatar_url @user.avatar.url(:medium)
json.photo_url @user.avatar.to_json

Второй даст вам дополнительные цитаты, которые вам, вероятно, не нужны. А почему оба?

Также здесь:

json.all_times @user.all_available_times.each do |time|
  json.day time.schedule.to_s
  json.time_block time.time_as_string
  json.next_occurrence time.schedule.next_occurrence(Time.now)
end 

Я думаю, вы хотите этого:

json.all_times @user.all_available_times do |time|
  json.day time.schedule.to_s
  json.time_block time.time_as_string
  json.next_occurrence time.schedule.next_occurrence(Time.now)
end 
person Paul A Jungwirth    schedule 16.03.2016
comment
Спасибо за ваше время, но ни один из них не помог мне с моей конкретной проблемой. - person JohnSalzarulo; 17.03.2016

Вы можете попробовать это, чтобы получить URL-адрес в ответе json, он работает для меня, поместив этот метод в вашу модель.

def avatar_url
  avatar.url(:medium)
end

И вызовите этот метод из контроллера, переопределив to_json()

render :json => @friends.to_json(:methods => [:avatar_url])
person Hard Developer    schedule 19.03.2016