2015-06-11 72 views
0

这里是上下文:我有一个模型和一个控制器,像这样的(非常简单,它只是一个例子):覆盖JSON哈希

class Model < ActiveRecord::Base 
    def to_json(options = {}) 
    return super({ :except => [ :id ] }) 
    end 
end 

class ModelsController < ApplicationController 
    def show 
    return @contact.to_json 
    end 
    def some_action 
    return { "foo" => @contact }.to_json 
    end 
end 

当我打电话show动作,Modelto_json行动是所谓的,我有没有id一个JSON:

{"first_name":"Vincent",[...]} 

当我打电话some_action行动,结果是这样的:

{"foo": "<Model:0x000000048c7388>"} 

怎么会有这种反应?

{"foo": {"first_name":"Vincent",[...]}} 

回答

0

我会建议使用串行库如ActiveModel::Serializers

gem 'active_model_serializers', '~> 0.9.3' 

注意版本!然后创建一个包含

class ContactSerializer < ActiveModel::Serializer 
    attributes :first_name 
end 

然后在您的控制器/app/serializers/contact_serializer.rb,它是那样简单

class ContactsController < ApplicationController 
    def show 
    render json: @contact, root: false 
    end 

    def some_action 
    render json: @contact, root: 'foo' 
    end 
end 

回应后会有

# show 
{"first_name": "..."} 

# some_action 
{"foo": {"first_name": "..."}} 
0

在这些种情况的最好方法go是在模型中重新定义serializable_hash,这种方式使用as_json方法,它会返回一个json,其中包含serialazable_hash方法中的定义。类似这样的:

class Model < ActiveRecord::Base 
    def serialazable_hash(options = {}) 
     options ||= {} 
     options = { 
      except: [:id] 
     }.update(options) 
     super options 
    end 
    end