如何在Rails 4 as_json方法中编写if语句?

时间:2015-04-28 20:45:56

标签: ruby-on-rails json ruby-on-rails-4

我正在使用Rails 4.我正在创建API数据库,用户可以从Facebook Graph API注册。 如果用户没有个人资料图片,则image_url为空。

在SO中阅读答案后,我认为这是如何为我的回复构建自定义json的正确方法。

我创建了方法as_json,以便在创建用户时仅使用应该返回的参数来呈现响应。 这是我创建json响应的方法:

no implicit conversion of nil into String

上述方法给出了一个错误: 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

如果我的数据库中存在图像,我需要提供绝对图像url路径,但如果我的数据库中的图像url为null,则我不需要提供此参数作为响应。 如何在as_json方法中编写if语句? 我试过这个,但它没有用。

no implicit conversion of nil into String

在Jorge de los Santos的帮助下,我设法通过此代码传递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 错误:

for /f "tokens=5" %A in ('dir C:^|findstr /i /c:"Volume Serial Number"') do if %A==00CC-CEF9 echo This is the drive

但是现在所有用户都返回了没有图像参数,即使他有图像网址。

3 个答案:

答案 0 :(得分:1)

您的代码似乎很好,除非您尝试合并图像密钥,合并功能无法正常工作,请检查以下内容以了解:

 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 :(得分: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

我建议为图片网址创建一个帮助器,所以我们可以调用像

这样的东西
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

然后在as json中调用方法

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

这会调用图片方法并将其设置在名为&#39;图像&#39;

的键中

答案 2 :(得分: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