我正在尝试创建一个使用JSON将信息发送到iOS应用程序的API。
我的控制器有一个名为`index:
的方法def index
@news = News.all
@banners = News.get_news_banners @news
render json: { all_news: @news.as_json( only: [:id, :headline], include: [:thumbnail]), success: true, banners: @banners.as_json }
end
新闻模型有一个名为thumbnail
的方法,我将其传递给JSON方法:
def thumbnail
image_multimedia = self.multimedia.where(file_type: Multimedia.file_types[:picture]).all
if image_multimedia.empty?
self.banners.last.image_file.url(:preview)
else
image_multimedia.each do |m|
m.asset.url(:preview)
end
end
end
收到的JSON看起来像:
{
all_news: [1]
0: {
id: 4
headline: "some new"
thumbnail: [1]
0: {
id: 4
server_location: null
created_at: "2014-10-14T13:13:33.000Z"
updated_at: "2014-10-14T13:13:33.000Z"
asset_file_name: "Screenshot_from_2014-09-25_11_10_41.png"
asset_content_type: "image/png"
asset_file_size: 6785
asset_updated_at: "2014-10-14T13:13:33.000Z"
storable_type: "News"
storable_id: 4
file_type: null
}-
-
}-
-
我希望我的方法只返回URL,而不是整个对象数据。
答案 0 :(得分:1)
为此,最好使用ActiveModel::Serializers。
使用AMS,你可以做到:
class NewsSerializer < ActiveModel::Serializer
attributes :url
end
然后在您的控制器中,您只需:
respond_to do |format|
format.html
format.json { render json: @news }
end
使用ActiveModel :: Serializers,您可以使用attributes
方法非常简单地指定JSON应包含的内容。
答案 1 :(得分:0)
我通过从以下链接http://apidock.com/rails/ActiveModel/Serializers/JSON/as_json正确研究as_json方法解决了这个问题,该链接明确指出我应该使用methods:
哈希来包含方法的结果。即
我不得不改变以下
render json: { all_news: @news.as_json( only: [:id, :headline], include: [:thumbnail]), success: true, banners: @banners.as_json }
到
render json: { all_news: @news.as_json( only: [:id, :headline], methods: :thumbnail), banners: @banners.as_json,success: true }