在我的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
?感谢
答案 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
酷!