Переопределение as_json не имеет никакого эффекта? - PullRequest
4 голосов
/ 28 мая 2010

Я пытаюсь переопределить as_json в одной из моих моделей, частично для включения данных из другой модели, частично для удаления некоторых ненужных полей. Из того, что я прочитал, это предпочтительный подход в Rails 3. Для простоты, скажем, у меня есть что-то вроде:

class Country < ActiveRecord::Base
  def as_json(options={})
    super(
      :only => [:id,:name]
    )
  end
end

а в моем контроллере просто

def show
  respond_to do |format|
    format.json  { render :json => @country }
  end
end

Тем не менее, что бы я ни пытался, вывод всегда содержит полные данные, поля не фильтруются предложением ": only". По сути, мое переопределение, похоже, не срабатывает, хотя, если я изменю его, скажем ...

class Country < ActiveRecord::Base
  def as_json(options={})
    {foo: "bar"}
  end
end

... Я действительно получаю ожидаемый вывод JSON. Я просто неправильно понял синтаксис?

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Это ошибка, но, увы, нет приза:

https://rails.lighthouseapp.com/projects/8994/tickets/3087

0 голосов
/ 28 мая 2010

Некоторое дальнейшее тестирование, в действии контроллера:

format.json { render :json => @country }

А в модели:

class Country < ActiveRecord::Base
    has_many :languages
    def as_json(options={})
        super(
            :include => [:languages],
            :except => [:created_at, :updated_at]
        )
    end
end

Выходы:

{
    created_at: "2010-05-27T17:54:00Z"
    id: 123
    name: "Uzbekistan"
    updated_at: "2010-05-27T17:54:00Z"
}

Однако явное добавление .to_json () к оператору рендеринга в классе и переопределение to_json в модели (вместо as_json) дает ожидаемый результат. С этим:

format.json { render :json => @country.to_json() } 

в моем действии контроллера, и ниже в модели, переопределение работает:

class Country < ActiveRecord::Base
    has_many :languages
    def to_json(options={})
        super(
            :include => [:languages],
            :except => [:created_at, :updated_at]
        )
    end
end

Выходы ...

{
    id: 123,
    name: "Uzbekistan",
    languages: [
        {id: 1, name: "Swedish"},
        {id: 2, name: "Swahili"}
    ]
}

... что является ожидаемым результатом. Я нашел ошибку? Я выиграю приз?

...