2009-08-12 1 views
0

позволяет сказать, что у меня есть следующее соотношение:Рельсы маршрутизации и до фильтра вопрос

class Event < ActiveRecord::Base 
    has_many :tickets 
end 

class Ticket < ActiveRecord::Base 
belongs_to :event 
end 

И у меня есть маршрут, как это:

map.resources :events, :has_many => :tickets 
    map.resources :tickets 

И у меня есть перед фильтром, как это на tickets_controller:

before_filter :get_event 

def get_event 
    @event = Event.find(params[:event_id]) 
end 

И у меня есть действие индекса на tickets_controller вроде этого:

if @event == nil 
    @tickets = Ticket.all 
else 
    @tickets = @event.tickets.all 
end 

Каким образом, если я перехожу в/билеты (где не передается экземпляр события), он говорит, что мне все еще нужен идентификатор события?

Я пытаюсь сохранить DRY, иначе я бы разделил действие индекса на действия и исключил его в фильтр перед.

оцените помощь!

ответ

0

код в вашем before_filter вызывается

@event = Event.find(params[:event_id]) 

и требует event_id.

Из-за версии поиска, которую вы используете, это версия, которая ищет определенный идентификатор, вы получаете исключение RecordNotFound.

Вы можете использовать

Event.first(params[:event_id]) 

и проверить ноль на что.

+0

, что имеет смысл! Не ценят помогите Лаз! – drpepper

0

Другой способ справиться с этим, чтобы исключить фильтр от действия индекса:

before_filter :get_event, :except => [:index] 

Затем поместите

@events = Event.all 

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

@events.Event.all(:limit => 10) 
0

Вам необходимо сначала проверить наличие event_id.

@event = Event.find(params[:event_id]) if params[:event_id] 
0

так, как я бы это

begin 
    @event = Event.find(params[:event_id]) 
rescue ActiveRecord::RecordNotFound 
    # do nothing -- can be written to do redirects but not necessary here 
end 

Кроме того, вы можете написать if @event == nil в if [email protected] (обратите внимание, не unless @event, так как еще делает, если в заблуждение.