2011-03-20 21 views
3

我一直在想方設法定製特殊字段,自定義格式等JSON我已經在我的模型中創建一個as_json和to_xml方法來制定我需要的對象。這個效果很好,但是它很sl because,因爲我的一些幫助器方法必須進入模型,因爲我需要幫助器和模型中的格式。我也認爲這是潦草的代碼,使模型失去控制。Rails - json.erb模板

我已經能夠獲得與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 %> 

這工作,但似乎很奇怪。任何人有建議或有辦法做到這一點?

順便說一句這樣做回調的工作

<%= 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

我可能會誤解你,但我不明白這是如何工作的。你至少錯過了一個關閉'}',我相信你需要返回一個包含對象的數組''[]'來創建一個合適的JSON結構。 '[{1: '富'},{2: '欄'},...]'。 – polarblau 2011-03-20 06:35:28

+0

對不起,我把整個JSON都剪掉了,因爲它很長......它錯過了一個}但它確實有效,我不知道爲什麼說實話。我確實試圖做<%= json=[]%>然後json.push(item.json)然後做了to_json。你知道一種正確的方法嗎?(謝謝你的回覆) – bokor 2011-03-20 06:42:01

+0

請在下面查看我的答案。 – polarblau 2011-03-20 07:22:34

回答

6

我認爲這樣做會跳過erb模板,如果你不是絕對需要的,如果由於某種原因的最佳途徑。然後,你可以做這樣的事情:

items = Item.all 
render :json => items.to_json(:only => [:id, :name]), :callback => params[:callback] 

您可以覆蓋在模型中to_json方法添加字段或調用方法。

+0

Polarblau,我實際上是通過覆蓋as_json方法在模型中做類似的事情,因爲我需要一堆自定義字段。例如,我正在使用幾個字段來存儲日期,但需要爲日期創建自定義值,例如1年和8個字符串,而不是日期。所以我想弄清楚如何用你的建議做到這一點。你知道怎麼做,而不是模板不相關。 – bokor 2011-03-20 14:38:43

+0

你是如何創建這個值的?你在使用視圖助手嗎? – polarblau 2011-03-20 20:11:58

+0

我正在考慮移動到json.erb文件,因爲有一堆視圖助手我用來生成我想要發回的json鏈接。在模型中包含助手會使其笨重,所以我想避免它。 – 2011-09-17 04:32:32

0

根據您的答案polarblau,你應該重寫as_json方法和使用:方法參數,包括你的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 
0

最有可能的,你想要麼:

  1. 使用自定義查找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')

  2. 如果有什麼東西你不能這樣做(或無法弄清楚)在SQL中,你可以恢復到紅寶石(雖然不推薦,因爲它是顯著更慢)

    API Dock for to_json