2015-04-28 3 views
0

Я использую Rails 4. Я создаю API databse, где пользователи могут зарегистрироваться в Facebook Graph API. Если у пользователя нет профиля, тогда изображение_url равно null.Как написать if statement в Rails 4 as_json method?

После чтения ответов в формате SO, я подумал, что это правильный способ создания пользовательского json для моего ответа.

Я создал метод as_json для рендеринга ответа, когда пользователь создан только с параметрами, которые должны быть возвращены. Это метод, как я создаю ответ JSon:

def as_json(options={}){ 
     id: self.id, 
     first_name: self.first_name, 
     last_name: self.last_name, 
     auth_token: self.auth_token, 
     image: { 
      thumb: "http://domain.com" + self.profile_image.thumb.url 
     } 
    } 
    end 

Этот метод выше, дает мне ошибку: no implicit conversion of nil into String.

Мне нужно предоставить абсолютный путь URL-адреса изображения, если изображение существует в моем db, но мне не нужно указывать этот параметр в ответ, если url изображения null в моей базе данных. Как написать инструкцию if внутри этого метода as_json? Я пробовал это, но он не работает.

def as_json(options={}){ 
     id: self.id, 
     first_name: self.first_name, 
     last_name: self.last_name, 
     auth_token: self.auth_token, 
     if !self.profile_image.thumb.url == nil 
      image: { 
       thumb: "http://domain.com" + self.profile_image.thumb.url 
      } 
     end  
    } 
    end 

С помощью Хорхе де-лос-Сантос, я сумел сделать это передать no implicit conversion of nil into String ошибку с этим кодом:

def as_json(options={}) 
    response = { id: self.id, 
       first_name: self.first_name, 
       last_name: self.last_name, 
       auth_token: self.auth_token } 
    if !self.profile_image.thumb.url == nil 
    image = "http://domain.com" + self.profile_image.thumb.url 
    response.merge(image: {thumb: image }) 
    end 
    response 
end 

Но теперь все пользователи будут возвращены без параметров изображения даже когда у него есть URL-адрес изображения.

ответ

1

Ваш код кажется нормально, за исключением, когда вы пытаетесь объединить ключ изображения, слияние функция не работает, как вы ожидаете, проверьте followingt понять:

hash = {a: 1, b:2 } 
hash.merge(b: 3) 
puts hash #{a: 1, b:2 } 
hash = hash.merge(b: 3) 
puts hash #{a: 1, b:2, c: 3 } 

так что вам нужно будет изменить код изменив эту строку:

response.merge(image: {thumb: image }) 

к

response = response.merge(image: {thumb: image }) 
+1

или bang it ..' response.merge! (....) ' –

0

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

def as_json(options={}) 
    response = { id: self.id, 
       first_name: self.first_name, 
       last_name: self.last_name, 
       auth_token: self.auth_token } 
    image = "http://domain.com" + self.profile_image.thumb.url 
    response.merge!({image: {thumb: image }}) unless self.profile_image.thumb.url 
    response 
end 
+0

А вам нужен ключ optionak! – tebayoso

+0

Благодарим за отзыв. Я попробовал, но это не работает, если URL-адрес изображения равен нулю. Я получил ошибку: 'неявное преобразование nil в String', где я не могу сделать' 'http://domain.com" + self.profile_image.thumb.url', если URL-адрес пуст. Но это поле может быть пустым, если у пользователя нет профиля в Facebook, и из-за этого я хотел включить URL-адрес изображения, только если он существует в базе данных. – Santar

+0

, потому что вы вызываете метод в nil. Это не указано в вашем вопросе. Обновите его трассировкой стека ошибки. – tebayoso

1

Использование JBuilder

При построении сложного объекта JSON, то лучше использовать JBuilder, я предполагаю, что модель называется «User»

Создать шаблон под названием show.json.jbuilder

json.id @user.id 
json.first_name @user.first_name 
json.last_name @user.last_name 
json.auth_token @user.auth_token 
unless @user.profile_image.thumb.url.nil? 
    json.image do |image| 
    image.thumb "http://domain.com#{@user.profile_image.thumb.url}" 
    end 
end 

Я бы рекомендовал создать помощник для URL изображения, так что мы могли бы, например, назвать что-то вроде

json.image @user.full_profile_image_url 


Использование as_json

Что касается вашего собственного метода (с помощью as_json) вы можете создать метод, который возвращает полный хэш

class User < ActiveRecord::Base 
    def image 
    { thumb: "http://domain.com#{profile_image.thumb.url}" } 
    end 
end 

изображения Затем в качестве JSON вызова метода

@user.to_json(
    only: %i(id first_name last_name auth_key), 
    methods: :image 
) 

Это вызовет метод изображения и задает его значение внутри ключа с именем 'image'

Смежные вопросы