我正在使用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
但是现在所有用户都返回了没有图像参数,即使他有图像网址。
答案 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