【问题标题】:Why does 'as_json' return the whole object instead of simple text?为什么'as_json'返回整个对象而不是简单的文本?
【发布时间】:2014-10-14 15:09:16
【问题描述】:

我正在尝试制作一个使用 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

News 模型有一个名为 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,而不是整个对象数据。

【问题讨论】:

  • 您的 JSON 无效,请使用您收到的正确字符串。我们需要有有效的输入数据才能为您提供帮助。

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


【解决方案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 应包含的内容。

【讨论】:

    【解决方案2】:

    我通过从以下链接http://apidock.com/rails/ActiveModel/Serializers/JSON/as_json 正确研究 as_json 方法解决了这个问题,该链接明确指出我应该使用methods: 哈希来包含方法的结果。 IE 我不得不更改以下内容

    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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-19
      • 2011-10-06
      • 2014-08-03
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多