为什么' as_json'返回整个对象而不是简单的文本?

时间:2014-10-14 15:09:16

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

我正在尝试创建一个使用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,而不是整个对象数据。

2 个答案:

答案 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 }