Ruby on rails 尽管定义了[GET],但没有与之匹配的路由

Ruby on rails 尽管定义了[GET],但没有与之匹配的路由,ruby-on-rails,ruby,Ruby On Rails,Ruby,我很难理解我为什么会有这个问题。我浏览了大部分类似的问题。在大多数情况下,作者忘记包括相关路线。然而,我清楚地知道,我把这个问题归因于我对Rails知识的不足,我希望你们中的一些人能够解决这个问题 我一直得到的错误是:No route matches[GET]“/fight.29”,尽管在resources:fights中定义了它,但我也尝试了其他方法,但没有效果 我注意到的几件事: 我的应用程序尝试访问http://localhost:3000/fight.29而不是http://local

我很难理解我为什么会有这个问题。我浏览了大部分类似的问题。在大多数情况下,作者忘记包括相关路线。然而,我清楚地知道,我把这个问题归因于我对Rails知识的不足,我希望你们中的一些人能够解决这个问题

我一直得到的错误是:
No route matches[GET]“/fight.29”
,尽管在
resources:fights
中定义了它,但我也尝试了其他方法,但没有效果

我注意到的几件事:

  • 我的应用程序尝试访问
    http://localhost:3000/fight.29
    而不是
    http://localhost:3000/fights/29
    通过
    飞行控制器中的重定向
  • 当我键入
    http://localhost:3000/fights/29
    手动操作,效果非常好
  • 我的
    战斗的show action
    缺少前缀
  • 在url内部的
    战斗
    29
    之间有一个
    。不确定这是什么意思,是否与错误有关
这是rake路由的输出:

            Prefix Verb   URI Pattern                                     Controller#Action
              root GET    /                                               static_pages#home
    fighter_skills GET    /fighters/:fighter_id/skills(.:format)          skills#index
                   POST   /fighters/:fighter_id/skills(.:format)          skills#create
 new_fighter_skill GET    /fighters/:fighter_id/skills/new(.:format)      skills#new
edit_fighter_skill GET    /fighters/:fighter_id/skills/:id/edit(.:format) skills#edit
     fighter_skill GET    /fighters/:fighter_id/skills/:id(.:format)      skills#show
                   PATCH  /fighters/:fighter_id/skills/:id(.:format)      skills#update
                   PUT    /fighters/:fighter_id/skills/:id(.:format)      skills#update
                   DELETE /fighters/:fighter_id/skills/:id(.:format)      skills#destroy
          fighters GET    /fighters(.:format)                             fighters#index
                   POST   /fighters(.:format)                             fighters#create
       new_fighter GET    /fighters/new(.:format)                         fighters#new
      edit_fighter GET    /fighters/:id/edit(.:format)                    fighters#edit
           fighter GET    /fighters/:id(.:format)                         fighters#show
                   PATCH  /fighters/:id(.:format)                         fighters#update
                   PUT    /fighters/:id(.:format)                         fighters#update
                   DELETE /fighters/:id(.:format)                         fighters#destroy
             fight POST   /fight(.:format)                                fights#start
         new_fight GET    /fights/new(.:format)                           fights#new
                   GET    /fights/:id(.:format)                           fights#show
这是我的
路线。rb

root 'static_pages#home'

  resources :fighters do
    resources :skills
  end
  post '/fight', to: 'fights#start'
  resources :fights, only: [:new, :show]

  #get  '/fights/:id/', to: 'fights#show'
  #match '/:id' => 'fights#show', via: [:get]
  def show
    @fight = Fight.find(params[:id])
  end
  def start
    @fight = Fight.create(attacker_id: params[:attacker_id], defender_id: params[:defender_id], winner: params[:winner])
    if @fight.save
      redirect_to @fight
    else
      redirect_to root_path
    end
  end
这是
控制器.rb

root 'static_pages#home'

  resources :fighters do
    resources :skills
  end
  post '/fight', to: 'fights#start'
  resources :fights, only: [:new, :show]

  #get  '/fights/:id/', to: 'fights#show'
  #match '/:id' => 'fights#show', via: [:get]
  def show
    @fight = Fight.find(params[:id])
  end
  def start
    @fight = Fight.create(attacker_id: params[:attacker_id], defender_id: params[:defender_id], winner: params[:winner])
    if @fight.save
      redirect_to @fight
    else
      redirect_to root_path
    end
  end
日志(另一个请求但出现相同错误):

我错过了什么

编辑:

<%= link_to 'FIGHT!', fight_path(@fight, attacker_id: @attacker.id,
                                          defender_id: @defender.id,
                                          winner: compare_power_levels(@attacker, @defender)), method: :post  %>


注意:比较功率级别仅在比较后返回两个对象中的一个。

如果在单击链接到标签时遇到此问题,请检查链接到标签中的路径

理想情况下,它应该如下所示:

<%= link_to 'show', fight_path(@fight) %>

如果您在单击链接到标签时遇到此问题,请检查链接到标签中的路径

理想情况下,它应该如下所示:

<%= link_to 'show', fight_path(@fight) %>

rails生成带有点的链接是因为您在路径或任何其他“收集”路线中使用了多元化

您没有将您的
链接添加到
,因此我将尝试解决以下问题:

<%= link_to 'show', fight_path(@fight) %>

rails生成带有点的链接是因为您在路径或任何其他“收集”路线中使用了多元化

您没有将您的
链接添加到
,因此我将尝试解决以下问题:

<%= link_to 'show', fight_path(@fight) %>
你可以试试

redirect_to "/fights/#{@fight.id}"

重定向到战斗路径(@fight)
您可以试试

redirect_to "/fights/#{@fight.id}"

重定向到战斗路径(@fight)
原因如下:

post '/fight', to: 'fights#start'
resources :fights, only: [:new, :show]
post'/fight'
生成命名路由
fight\u路径
,该路径通常由
资源
创建。由于它已经定义,
资源
不会覆盖它。您可以在路线中看到:

fight POST   /fight(.:format)                                fights#start
虽然它应该是:

fight GET   /fight/:id(.:format)                                fights#start
由于route只有一个可选参数
:format
,当您调用
战斗路径(@user)
时,
@user.id
被用作格式,结果是
'/fight.30'

您需要重命名您的
post'/fight'
路线:

post '/fight', to: 'fights#start', :as 'start_fight'
原因是:

post '/fight', to: 'fights#start'
resources :fights, only: [:new, :show]
post'/fight'
生成命名路由
fight\u路径
,该路径通常由
资源
创建。由于它已经定义,
资源
不会覆盖它。您可以在路线中看到:

fight POST   /fight(.:format)                                fights#start
虽然它应该是:

fight GET   /fight/:id(.:format)                                fights#start
由于route只有一个可选参数
:format
,当您调用
战斗路径(@user)
时,
@user.id
被用作格式,结果是
'/fight.30'

您需要重命名您的
post'/fight'
路线:

post '/fight', to: 'fights#start', :as 'start_fight'


您建立的链接不正确,能否显示将您重定向到该错误的代码?@BroiSatse我编辑了我的帖子。您建立的链接不正确,能否显示将您重定向到该错误的代码?@BroiSatse我编辑了我的帖子。我更新了我的评论,问题出现在我发出post请求,然后尝试重定向到fights show页面之后。看一看,让我知道。在这里发布“post”请求有什么必要?理想情况下,它应该是GET request,并且您也在routes.rb中定义了一个routes。rb为:GET/fights/:id(:format)fights#show
fights(路径
是索引操作的路径,除了可选的
:format
之外,helper不需要任何参数。这将生成到
/fights的链接。30
@BroiSatse是的,这是我在下面的回答中所说的。。。这就是问题所在,看看他的
redirect\u to
@SsouLlesS-你可以在他的编辑中看到,他已经使用了
fight\u path
,这意味着
fight\u path
url\u helper definitioni更新了我的评论,这个问题出现在我发出post请求后,然后尝试重定向到fights show页面。看一看,让我知道。在这里发布“post”请求有什么必要?理想情况下,它应该是GET request,并且您也在routes.rb中定义了一个routes。rb为:GET/fights/:id(:format)fights#show
fights(路径
是索引操作的路径,除了可选的
:format
之外,helper不需要任何参数。这将生成到
/fights的链接。30
@BroiSatse是的,这是我在下面的回答中所说的。。。这就是问题所在,看看他的
redirect\u to
@SsouLlesS-你可以在他的编辑中看到,他已经使用了
fight\u path
,这意味着
fight\u path
url\u helper definitionfirst一个给我一个连接错误。第二个显示的错误与我在第一篇文章中的错误相同。第一个显示的是连接错误。第二个显示的错误与我在第一篇文章中的错误相同。虽然你的答案很有道理,并帮助我理解它,但解决方案本身不起作用@然而,pitabas prathal的第一个解决方案解决了这个问题。我相信这可能与我的应用程序的结构有关。在您的回答之后,我得到的错误是‘没有路线匹配{:操作=>“显示”,:攻击者id=>9,:控制器=>“战斗”,:防御者id=>8,:id=>8,:获胜者=>8}缺少所需的键:[:id]'