Рендеринг 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
Фрагмент My 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 просто не смешивается, и я не могу до конца понять. Любая помощь с благодарностью.
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
Вы можете попробовать это, чтобы получить URL-адрес в ответе JSON, он работает для меня, поместил этот метод в вашу модель.
def avatar_url
avatar.url(:medium)
end
И вызвать этот метод из контроллера, переопределив to_json()
render :json => @friends.to_json(:methods => [:avatar_url])
Трудно сказать, в чем может быть проблема, не зная ошибки, но эти вещи выглядят подозрительно или просто неправильно:
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