控制器方法#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
,据我所知,这应该按照检查的顺序渲染路线。