2009-08-12 87 views
0

之前可以說,我有如下關係:Rails的路由和過濾問題

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 

如果我去/門票(沒有事件實例通過)它說我仍然需要一個事件ID?

我想保持DRY,否則我會將索引操作分隔到操作中,並在之前的過濾器中排除一個操作。

感謝幫助!

回答

0

在你的before_filter的代碼被稱爲

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

,它需要的事項標識。

由於您正在使用的查找版本,即查找特定ID的版本,因此您將得到一個RecordNotFound異常。

您可能需要使用

Event.first(params[:event_id]) 

和檢查上爲零。

+0

有道理!欣賞幫助拉茲! – drpepper 2009-08-12 04:26:15

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 == nilif [email protected](注意不是unless @event因爲別的使得除非混亂。