2010-05-27 3 views
4

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

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 

Yet независимо Я пытаюсь, вывод всегда содержит полные данные, поля не фильтруются по условию «: only». В принципе, мой переопределение, кажется, не загнуться, но если я могу изменить его, скажем ...

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

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

+0

Btw - Я получил это далеко после прочтения http://jonathanjulian.com/2010/04/rails-to_json-or-as_json/ –

+0

См. Также http://stackoverflow.com/questions/2556468/override-as-json-or-to-json-model-class-name –

+0

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

ответ

0

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

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() в оператор render в классе и переопределение to_json в модели (вместо as_json) вызывает ожидаемый re Sult. При этом:

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"} 
    ] 
} 

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

+0

У вас есть плагин или что-то установленное, которое определяет его собственные 'to_json' или' as_json'? – x1a4

+0

Не знаю, что я знаю, только добавленные дополнения - это Warden, Devise и CanCan ... –

Смежные вопросы