2013-11-26 37 views
1

在我的Rails應用程序,我在我的模型中定義一個特定的JSON格式的:定義幾個JSON格式模型

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

和Controller我只需撥打:

format.json { render json: @patients} 

所以,現在的IM試圖爲另一個動作定義另一個JSON格式,但我不知道如何? 我該如何定義另一個as_json,或者如何將變量傳遞給as_json?由於

+1

您可以將變量傳遞給as_json:'{render json:@ patients.as_json(include_relation:true)}'並根據選項定義您自己的條件 – MrYoshiji

+0

好的但我認爲在這裏我需要別的東西? –

+1

我發佈了一個答案,這是一種混亂,但你明白了,不要猶豫,要求任何事情;) – MrYoshiji

回答

1

通過定義(例子1)中的相應模型類(即用戶模型)中的'as_json'方法的散列結構,其成爲json格式中的活動記錄(即,用戶)的默認散列結構。它不能被任何內聯的定義被重寫如實施例中所定義: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 

因此,在本實施例中,當創建動作被執行「用戶'則返回( 「只:[:ID,:姓名,:郵箱]」)格式而不是( 「只:[:ID,:名字]」)

所以,選擇= {}傳遞給as_json方法來爲d指定不同的格式不同的方法。

最佳實踐,是定義散列結構常數,並調用它everwhere它需要

對於實施例 例如:型號/ user.rb 這裏,常數以模型類中定義

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

例如:控制器/ 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 

很酷!

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) } 
+0

謝謝,我會試試看! –

+1

在1分鐘內我會打破你的12k! –

+0

啊哈謝謝!希望這篇文章可以幫助你 – MrYoshiji