Рендеринг 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 
Другие вопросы по тегам