控制器方法#show被调用

我的#index视图上有一个链接:

  

routes.rb与此有关:

 resources :tickets get 'tickets/calendar' => 'tickets#ics_export' post 'tickets' => 'tickets#index' patch 'tickets/:id/close' => 'tickets#close', as: 'close_ticket' post 'tickets/:id' => 'ticket_comments#create' 

我的TicketsController属于:

 before_action :set_ticket, only: [:show, :edit, :destroy, :update, :close] def show @ticket_comment = TicketComment.new end def ics_export tickets = Ticket.all respond_to do |format| format.html format.ics do cal = Icalendar::Calendar.new tickets.each do |ticket| event = Icalendar::Event.new event.dtstart = ticket.start event.description = ticket.summary cal.add_event(event) end cal.publish render :text => cal.to_ical end end end private def set_ticket @ticket = Ticket.find(params[:id]) end 

当我点击链接时,它会将我带到/tickets/calendar.ics这是正确的,但我收到以下错误:

ActiveRecord::RecordNotFound in TicketsController#show

Couldn't find Ticket with 'id'=calendar

Extracted source (around line #83):

  private def set_ticket @ticket = Ticket.find(params[:id]) end 

@ticket = Ticket.find(params[:id])突出显示。 这是有道理的,它没有调用具有calendar ID的票证。

请求有参数:

{"id"=>"calendar", "format"=>"ics"}

我该如何解决这个错误? 为什么要调用show动作?

从外部到效果的规范Rails路由中有一个脚注:

Rails路由按照指定的顺序进行匹配,因此如果您有资源:获取’photos / poll’之上的照片,资源行的show action路线将在获取行之前匹配。 要解决此问题,请将获取行移到资源行上方,以便首先匹配。

如评论所述,修复方法是在resources :tickets之前指定get 'tickets/calendar' => ... 如果路线的顺序有问题,您可以运行rake routes ,据我所知,这应该按照检查的顺序渲染路线。