本文介绍了控制器方法#show 被调用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a link on my #index view:

<%= link_to 'Export Calendar (ICS)', { controller: :tickets, action: :ics_export, format: :ics }, class: "class-needed right" %>

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,这是正确的,但出现以下错误:

And when I click the link, it takes me to /tickets/calendar.ics which is correct but I get the following error:

ActiveRecord::RecordNotFound in TicketsController#show

找不到'id'=calendar

提取的源代码(围绕第 83 行):

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

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

The @ticket = Ticket.find(params[:id]) is highlighted. Which make sense that it is failing to call a ticket with an id of calendar.

请求有参数:

{"id"=>"日历","格式"=>"ics"}

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

How do I fix this error? Why is it calling the show action?

推荐答案

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

Rails 路由按照它们指定的顺序进行匹配,因此如果您在 get 'photos/poll' 上方有一个 resources :photos,则资源行的 show action 路由将在 get 行之前匹配.要解决此问题,请将 get 行移动到资源行上方,使其首先匹配.

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

As commented, the fix is to specify get 'tickets/calendar' => ... ahead of resources :tickets. If the order of routes is in question, you can run rake routes, which, to the best of my knowledge, should render your routes in the order they are checked.

这篇关于控制器方法#show 被调用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-06 00:49