为模型定义几种json格式

时间:2013-11-26 20:55:37

标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-4

在我的rails app中,我在我的模型中定义了一个特定的JSON格式:

def as_json(options={})
     { 
         :id => self.id,
         :name => self.name + ", " + self.forname
     } 
end

在控制器中我只是打电话:

 format.json { render json: @patients}

所以现在我试图为另一个动作定义另一个JSON格式,但我不知道怎么做? 我如何定义另一个as_json或如何将变量传递给as_json?感谢

2 个答案:

答案 0 :(得分:2)

一种非常难看的方法,但你可以重构它以获得更好的可读性:

def as_json(options={})
  if options.empty?
    { :id => self.id, :name => self.name + ", " + self.forname }
  else
    if options[:include_contact_name].present?
      return { id: self.id, contact_name: self.contact.name }
    end
  end
end

好的,我应该给你一段更好的代码,这是:

def as_json(options = {})
  if options.empty?
    self.default_json
  else
    json = self.default_json
    json.merge!({ contact: { name: contact.name } }) if options[:include_contact].present?
    json.merge!({ admin: self.is_admin? }) if options[:display_if_admin].present?
    json.merge!({ name: self.name, forname: self.forname }) if options[:split_name].present?
    # etc etc etc.

    return json
  end
end

def default_json
  { :id => self.id, :name => "#{self.name}, #{self.forname}" }
end

用法:

format.json { render json: @patients.as_json(include_contact: true) }

答案 1 :(得分:1)

通过' as_json'定义哈希结构方法,在各自的模型类中,即(例1)中的用户模型,它成为json格式的活动记录(即用户)的默认哈希结构。它不能被Example:2

中定义的任何内联定义覆盖

示例1:

class User < ActiveRecord::Base
 .....
  def as_json(options={})
    super(only: [:id, :name, :email])
  end
end

示例:2

class UserController < ApplicationController
 ....
  def create 
    user = User.new(params[:user])
    user.save
    render json: user.as_json( only: [:id, :name] )
  end
end

因此,在此示例中,当执行创建操作时,用户&#39;返回(&#34;仅限:[:id,:name,:email]&#34;)格式不是(&#34;仅:[:id,:name]&#34;)

因此,options = {}被传递给as_json方法,以指定不同方法的不同格式。

最佳实践,是将哈希结构定义为常量,并在需要的地方调用它

例如 例如:models / user.rb 这里,常量在模型类

中定义
class User < ActiveRecord::Base
...
...
 DEFAULT_USER_FORMAT  = { only: [:id, :name, :email] }
 CUSTOM_USER_FORMAT = { only: [:id, :name] }
end

Ex:controllers / user.rb

class UserController < ApplicationController
 ...
  def create
  ...
  render json: user.as_json(User::DEFAULT_USER_FORMAT)
  end

  def edit
  ...
  render json: user.as_json(User::CUSTOM_USER_FORMAT)
  end
end

酷!