Rails - json.erb模板

时间:2011-03-20 06:25:09

标签: ruby-on-rails json ruby-on-rails-3 api

我一直试图找到一种方法来使用特殊字段,自定义格式等来自定义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]  %>

3 个答案:

答案 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)

最有可能的是,你要么:

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

  2. 如果你在SQL中无法做到(或无法弄清楚),你可能必须恢复到Ruby(虽然不推荐,因为它明显变慢)

    API Dock for to_json