【问题标题】:Rails routing and before filter questionRails 路由和过滤之前的问题
【发布时间】:2009-08-12 03:43:58
【问题描述】:

假设我有以下关系:

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

我在门票控制器上有一个像这样的前置过滤器:

 before_filter :get_event

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

我在门票控制器上有一个索引操作,如下所示:

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

如果我转到 /tickets(没有传递事件实例)怎么会说我仍然需要一个事件 ID?

我正在尝试保持 DRY,否则我会将索引操作分成操作并在之前的过滤器中排除一个。

感谢您的帮助!

【问题讨论】:

    标签: ruby-on-rails routing


    【解决方案1】:

    正在调用 before_filter 中的代码

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

    它需要一个 event_id。

    由于您使用的 find 版本,即正在查找特定 id 的版本,您会收到 RecordNotFound 异常。

    你可能想使用

    Event.first(params[:event_id])
    

    然后检查 nil。

    【讨论】:

    • 有道理!感谢 Laz 的帮助!
    【解决方案2】:

    处理它的另一种方法是从索引操作中排除过滤器:

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

    然后放置

    @events = Event.all
    

    进入索引操作。由于您很可能只列出有限数量的事件,因此可能:

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

    【讨论】:

      【解决方案3】:

      您需要首先检查是否存在 event_id。

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

      【讨论】:

        【解决方案4】:

        我会这样做

        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,因为 else 会使除非混淆。

        【讨论】:

          猜你喜欢
          • 2014-12-26
          • 1970-01-01
          • 2023-04-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多