Rails - шаблон json.erb - PullRequest
       14

Rails - шаблон json.erb

3 голосов
/ 20 марта 2011

Я пытался найти способ настроить JSON с помощью специальных полей, пользовательских форматов и т. Д. И т. Д. Я создал метод as_json и to_xml в моей модели, чтобы сформулировать объект так, как мне нужно. Это работает хорошо, но неаккуратно, потому что некоторые из моих вспомогательных методов должны были перейти в модель, потому что мне нужны форматы в помощниках и модели. Я также думаю, что это неаккуратный код и выводит модель из-под контроля.

Мне удалось получить формат с работающим json.erb, но я не думаю, что он работает на 100% правильно, и обратный вызов тоже не добавляется. Кто-нибудь получить эту работу

Вот что я получил до сих пор.

API вызывает формат.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]  %>

Ответы [ 3 ]

6 голосов
/ 20 марта 2011

Я думаю, что лучший способ сделать это - пропустить шаблон erb, если вам по какой-то причине это не нужно.Затем вы можете сделать что-то вроде этого:

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

Вы можете переопределить метод to_json в вашей модели, чтобы добавить поля или вызвать методы.

0 голосов
/ 20 марта 2011

Скорее всего, вы захотите либо:

  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, вам может придется вернуться к Ruby (хотя это и не рекомендуется, поскольку это значительно медленнее)

    Док-станция для API to_json

0 голосов
/ 20 марта 2011

Исходя из вашего ответа в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...