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))が、respond_with で :methods を使用する方法がわかりません

4

1 に答える 1

1

これは答えを提供するようです。to_json次のような定義を使用して、必要に応じてモデルにandを実装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 に答える