ruby on rails—在responding_to JSON调用时包含虚拟属性



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

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))的东西,但我不知道如何使用:方法在一个respond_with

这似乎提供了答案。适当地在您的模型中实现to_jsonto_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_jsonas_json的混淆。

相关内容

  • 没有找到相关文章

最新更新