Опции to_json [: методы] не работают для Model.all - PullRequest
0 голосов
/ 23 января 2011

У меня есть модель с виртуальным атрибутом, который я хотел бы включить, когда модель отображается как JSON. Я сделал это:

def to_json(options={})
  options[:methods] ||= []; 
  options[:methods] << :date_string;
  super(options);
end

, который добавляет мой метод date_string в список атрибутов, которые будут отображаться при создании JSON.

В моем контроллере действие show дает правильный результат, отображая date_string, как если бы это был обычный атрибут:

  def show
    @project = Project.find params[:id]
    respond_to do |format|
      format.html
      format.json { render :json => @project }
    end
  end

но действие index не включает date_string:

  def index
    @projects = Project.all
    respond_to do |format|
      format.html
      format.json { render :json => @projects }
    end
  end

Кто-нибудь знает, возможно ли заставить это работать? Я предполагаю, что он не использует специфичную для модели to_json при рендеринге коллекции.


Редактировать: Похоже, мне следует использовать as_json сейчас - я посмотрю, решит ли это это.

Edit2: Я не думаю, что as_json здесь что-то меняет.

Ответы [ 2 ]

2 голосов
/ 24 января 2011

Глядя на ActiveModel :: Serialization docs , похоже, что вы можете переопределить метод serializable_hash для включения ваших виртуальных полей:

def serializable_hash(options)
  super(options.deepmerge({:methods => :date_string}))
end  

Обратите внимание, что это добавит егов все форматы сериализации (например, JSON и XML).

Если это не сработает, добавьте некоторые записи в журнал, чтобы узнать, вызывается ли метод даже в случае сбора.

1 голос
/ 25 января 2011

as_json должен работать. to_json преобразует значение в json и кодирует его. as_json выполняет преобразование без кодирования. Массивы преобразуют свои объекты без кодирования, а затем кодируют всю строку за один раз, поэтому метод as_json () вашей модели вызывается при сериализации массива:

https://github.com/rails/rails/blob/master/activesupport/lib/active_support/json/encoding.rb#L215

Я смог воспроизвести вашу проблему локально, и это решение помогло мне:

def as_json(options={})
  options ||= {} # need this because to_json without options will pass nil to as_json
  options[:methods] ||= []; 
  options[:methods] << :date_string;
  super(options);
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...