假设我有以下关系:
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
我对ticket_controller有一个索引操作,如下所示:
if @event == nil
@tickets = Ticket.all
else
@tickets = @event.tickets.all
end
如果我去/ ticket(没有传递事件实例)它怎么说它还说我还需要一个事件ID?
我正在尝试保持DRY,否则我会将索引操作分离为操作并在过滤器中排除一个。
感谢帮助!
答案 0 :(得分:0)
正在调用before_filter中的代码
@event = Event.find(params[:event_id])
,它需要一个event_id。
由于您正在使用的find版本,即寻找特定ID的版本,您将获得RecordNotFound异常。
您可能想要使用
Event.first(params[:event_id])
并检查是否为零。
答案 1 :(得分:0)
处理它的另一种方法是从索引操作中排除过滤器:
before_filter :get_event, :except => [:index]
然后放置
@events = Event.all
进入索引动作。由于您很可能只列出有限数量的事件,可能是:
@events.Event.all(:limit => 10)
答案 2 :(得分:0)
首先需要检查是否存在event_id。
@event = Event.find(params[:event_id]) if params[:event_id]
答案 3 :(得分: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 !@event
(请注意不是unless @event
,因为除非造成混淆,否则会{{1}}。