2

我有一个帖子模型,它有一个我想设置的虚拟属性,然后包含在对我的 post#index 操作的 JSON 调用的响应中。我似乎无法将虚拟属性包含在响应中。

class Post < ActiveRecord::Base
  attr_accessible :height
  attr_accessor :m_height
end

class PostsController < ApplicationController
  respond_to :html, :json, :js

  def index
    story = Story.find(params[:story_id])
    @posts = story.posts.where("posts.id >= ?", 100)
    @posts.each do |post|
      post.m_width = post.height * 200
    end
    results = { :total_views => story.total_views,  
                :new_posts => @posts }
    respond_with(results)
  end
end

我认为我必须需要类似的东西@post.to_json(:methods => %w(m_width)),但我不知道如何在 response_with 中使用 :methods

4

1 回答 1

1

似乎提供了答案。酌情在您的模型中实施 a to_jsonand to_xml,其定义如下:

这里暗示了一个更好的答案。

以下代码从帖子中窃取:

  def as_json(options={})
    super(options.merge(:methods => [...], :only => [...], :include => [...])
  end

to_json在这种情况下,不会在您的模型上调用,从我在源代码中可以看出,但as_json会在序列化过程中。

因此,以概览形式发生的情况如下:

  1. respond_with您使用已构建的结果哈希调用。
  2. Rails (ActionController)调用 to_json
  3. to_json 将您发送到 JSON::Encoding,它会一直调用as_json,直到所有内容都被 JSON 化。

这就是为什么在这个答案的早期版本中存在混淆to_json的原因。as_json

于 2012-12-30T05:17:17.997 回答