我一直试图找到一种方法来使用特殊字段,自定义格式等来自定义JSON。我在我的模型中创建了一个as_json和to_xml方法,以便根据我的需要制定对象。这很好用,但它很草率,因为我的一些辅助方法必须进入模型,因为我需要帮助器和模型中的格式。我也认为这是一个草率的代码,使模型失控。
我已经能够获得json.erb工作的格式,但不认为它正在100%正确工作,并且回调也不会附加。任何人都可以这样工作
这是我到目前为止所得到的。
api调用format.json
调用的模板是items.json.erb
<% @items.each do |item| %>
<%= { :item => { :id => item.id, :name => item.name }.to_json.html_safe %>
<% end %>
这有效,但看起来很奇怪。有人有建议或有办法吗?
btw为回调工作做了这个
<%= params[:callback]+"(" if params[:callback] %>
<% @items.each do |item| %>
<%= { :item => { :id => item.id, :name => item.name }.to_json.html_safe %>
<% end %>
<%= ")" if params[:callback] %>
答案 0 :(得分:6)
我认为最好的方法是跳过erb
模板,如果由于某种原因你不是绝对需要的话。然后你可以做这样的事情:
items = Item.all
render :json => items.to_json(:only => [:id, :name]), :callback => params[:callback]
您可以覆盖模型中的to_json
方法以添加字段或调用方法。
答案 1 :(得分:0)
根据你对polarblau的回答,你应该覆盖as_json方法并使用:methods参数在json中包含方法结果
class Item
def date
return "1 year and 8 months" #obviously use logic here
end
def as_json(args={})
super(:methods=>[:date], :only=>[:id=>:name])
end
end
答案 2 :(得分:0)
最有可能的是,你要么:
使用自定义finder sql来改变列名/执行计算(它比Ruby快得多):
MyModel.select('col_name_that_needs_renamed AS new_name').order('some_col DESC')
或更复杂的例子:
MyModel.find_by_sql('SELECT col_name_that_needs_renamed AS new_name, foo_col*50 AS math WHERE foo=bar ORDER some_col LIMIT 8')
如果你在SQL中无法做到(或无法弄清楚),你可能必须恢复到Ruby(虽然不推荐,因为它明显变慢)