【问题标题】:Rails routing error help No route matchesRails 路由错误帮助 没有路由匹配
【发布时间】:2023-11-20 13:48:01
【问题描述】:

访问网址http://localhost:3000/admin/login 时出现此错误: ActionController::RoutingError in Admin/login#index

/app/views/admin/login/index.rhtml where line #18 raised:

No route matches {:action=>"login_in_user", :controller=>"admin/login"}

Extracted source (around line #18):

15:     
16: <h2>Login</h2>
17: <div class="spacer">&nbsp;</div>
18: <%= form_tag(:action => "login_in_user") %>
19: 
20: 
21:  <p>

这是我在控制器/管理员中的管理员登录控制器类:

class Admin::LoginController < ApplicationController

我的路线文件:

namespace :admin do
  resources :login
end
match ':controller/service.wsdl', :action => 'wsdl'

# Install the default route as the lowest priority.
match ':controller/:action/:id'

我确实有一个名为:login_in_user 的操作

更新旧路线文件:

  map.connect ':controller/service.wsdl', :action => 'wsdl'

  # Install the default route as the lowest priority.
  map.connect ':controller/:action/:id'

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3


    【解决方案1】:

    问题在于,您尝试创建链接的网址没有任何映射。 login_in_user 不是标准资源操作之一,因此您需要显式添加它。您案例中的相关routes.rb 条目目前如下所示:

    namespace :admin do
      resources :login
      # and other stuff...
    end
    

    如果你这样做,它可能会起作用:

    namespace :admin do
      resources :login do
        collection do
          post :login_in_user
        end
      end
    

    但是,请记住,资源并不适合所有控制器。创建resources 条目会生成映射到七个特定操作的路由,适用于管理资源。带有名为“login_in_user”的操作的“LoginController”对我来说听起来不像是一种资源。您可能只是试图创建一个具有特定路径的控制器,以通过不同的方式登录。在这种情况下,也许您可​​以像这样创建路由:

    namespace :admin do
      post 'login/login_in_user'           => 'login#login_in_user'
      post 'login/login_in_some_other_way' => 'login#login_in_some_other_way'
      # ...
    end
    

    您的其他一些路线在我看来也有点偏离。如果您还没有,我强烈建议您阅读此 Rails 指南:http://guides.rubyonrails.org/routing.html

    编辑

    我应该解释一下,以防万一,rails 不允许自动访问控制器的操作。对于用户需要访问的每个 url,您始终需要在路由文件中添加一个条目。在您的情况下,您在底部有一个简单的包罗万象的规则,如下所示:

    # Install the default route as the lowest priority.
    match ':controller/:action/:id'
    

    不再推荐这样做,因为它会提供对太多操作的不必要访问,并且对访问方法(GET、POST 等)没有任何限制。即便如此,如果你想为你的管理界面安装一个包罗万象的路由,你可以在你的 :admin 命名空间中做同样的事情:

    namespace :admin do
      match ':controller/:action/:id'
    end
    

    在这种情况下,这应该可以解决您的问题,但同样,这通常不是一个好主意。我的印象是您正在处理遗留代码,因此这可能是一个合理的临时修复,但我仍然会先手动创建所有必要的路由,然后考虑如何重写控制器以合理地使用资源。正如我上面提到的,对于您的问题,这应该可以解决问题:

    namespace :admin do
      post 'login/login_in_user' => 'login#login_in_user'
    end
    

    【讨论】:

    • 我已使用 rails 1.2.6 中的旧路线文件更新了我的问题。你知道重写它的聪明方法吗?
    • 我已经更新了我的答案,虽然我不确定我是否理解你在问什么。