Ruby on Rails: проблема добавления переходного атрибута в объект для сериализации JSON - PullRequest
3 голосов
/ 25 августа 2010

В моем контроллере Item я хочу добавить временный (то есть непостоянный) атрибут к моему объекту модели, прежде чем отобразить его как JSON.

def show

    @item = Item.find(params[:id])
    @item.comment = "some comment"

    render :json => @item 
end

Мой класс Item выглядит так:

class Item < ActiveRecord::Base

    attr_accessor :comment
    @comment

конец

Моя проблема в том, что переменная экземпляра комментария не отображается в JSON. Все, что является постоянным, появляется в выводе JSON. Нужно ли переопределить метод to_json, чтобы это работало? Или есть более простой способ обеспечить отображение комментария в выводе JSON?

Спасибо за вашу помощь.

-------------- Обновление

Это решение, которое возникло из предположения Чубаса. Переопределение метода to_json для Item:

def to_json(options = {})

    options[:methods] = :comment;

    super(options)

end

Хотелось бы узнать, совпадает ли это с вашими мыслями, Чубас.

Ответы [ 4 ]

2 голосов
/ 25 августа 2010

Я бы порекомендовал вам самим создать объект для преобразования в json. Это устранит проблему с комментарием и предотвратит случайное раскрытие информации, которую вы не хотите предоставлять.

Что-то вроде:

render :json => {
  :item => {
    :name => 'Some Item',
    ...
    :comment => 'Some Comment
  }
}
1 голос
/ 25 августа 2010

Вы должны быть в состоянии сделать это, используя: include

@item.to_json(:include => :comments)

или: методы

@item.to_json(:methods => :comments)
1 голос
/ 25 августа 2010

Если вы хотите больше контроля над тем, что нужно визуализировать, вместо создания объекта json в контроллере (плохой дизайн), переопределите метод as_json в модели , вызывая super и используя methods возможность включить :comment.Вы можете увидеть поведение по умолчанию здесь

0 голосов
/ 26 февраля 2013

Не думаю, что вам следует перезаписывать метод to_json. Почему бы просто не добавить атрибуты в хеш объекта перед вызовом to_json?

@object[:new_attr] = value
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...