Rails路由和过滤器问题之前

时间:2009-08-12 03:43:58

标签: ruby-on-rails routing

假设我有以下关系:

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,否则我会将索引操作分离为操作并在过滤器中排除一个。

感谢帮助!

4 个答案:

答案 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}}。