【问题标题】:Action 'index' could not be found for <x>Controller找不到 <x>Controller 的操作“索引”
【发布时间】:2015-05-30 20:07:59
【问题描述】:

所以我刚刚创建了带有控制器login_controller.rb 和视图login.html.erb 的rails 4.1.2 项目。我已经编辑了我的routes.rb 并在创建控制器后删除了已经通过rails 放置的路由并添加了另一个默认的match 路由:controller(/:action(/:id))', :via =&gt; :get

当我使用rails s 运行我的服务器并打开localhost:3000/login 时,它给了我这个错误:

The action 'index' could not be found for LoginController

我不知道它为什么要寻找一个名为“索引”的动作。如果我是对的,那么 rails 在没有实际指定的情况下采取的默认操作是“索引”,所以我尝试更改我的 URL 并请求这样做:

localhost:3000/login/login

这给了我这个错误:

No route matches [GET] "/login/login"

我该如何解决这个问题?谢谢。

这是我的rake routes 输出的内容:

Prefix Verb URI Pattern                             Controller#Action
       GET  /:controller(/:action:(/:id))(.:format) :controller#:action

【问题讨论】:

  • 在您的 Rails 应用程序的目录中执行 rake rutes 以查看所有可用路线并添加到您的帖子中
  • 我从来没有使用过这样的路线......对不起。还要检查控制器名称可能是logins_controller.rb(复数)
  • 您的登录控制器中有login 操作吗?
  • @inye 是的,我有它。

标签: ruby-on-rails ruby routes ruby-on-rails-4.1


【解决方案1】:

假设您有一个模型User 和控制器UsersController。在您的 routes.rb 文件中,您根据控制器操作列出资源和路由到 match。默认情况下,该资源包括:index, :show, :new, :edit, :create, :update, :destroy。您可以通过以下方式指定您想要(或不想要):

# config/routes.rb

# blacklisting - these are not in your controller
resource :users, exclude: [:show, :destroy], via: [:get, :post]

# whitelisting - these are in your controller
resource :users, only: [:index], via: [:get, :post]

据我了解,您的视图的文件名(除非渲染或资产)对应于控制器操作。您的登录页面的视图是否命名为index.html.(erb|haml)?如果是,您应该像def index; end 一样简单地定义索引。但是,我建议您添加一些将用户重定向到主页或登录页面的内容,具体取决于他们是否已经登录。

从那里开始,当您定义方法 login 时,真正的魔法发生在您的控制器中。在这里,检查传入的参数并在正确的情况下登录用户。将其视为类似于#update 操作。

与定义要包含在路由中的操作的方式类似,您可以制作自己的自定义操作。请注意:order of routes matter。我自己并不是 100% 认同这个概念,但在你的情况下,我会建议:

#config/routes.rb

resource :login, only: [:index], via: [:get, :post]
match '/login/login' => 'login#login', via: [:get, :post]

您还可以使用match/login/index 链接到#login 方法。该视图仍将称为index。因为它有一个路由,所以你不需要登录操作的视图——它只是解析参数,而索引会显示错误消息。

【讨论】:

  • 所以你最后一个代码 sn-p 中的第一条语句是首先检查控制器是否为'/login'而不是它应该重定向到'index',如果不匹配则它应该去登录。我不明白一件事。如果第一条路由不匹配,那么在尝试执行下一条路由之前它不会抛出路由错误吗?另外,您能否解释一下这两条语句的真正作用。我知道第二个,但你能详细说明第一个吗? PS我通过删除并重新创建控制器并在我的application.js中包含jquery来解决我的问题。如果……
  • .....您的解决方案比我在那里所做的要好,然后请向我解释一下,或者告诉我无论如何我做了正确的事情。谢谢。 :)
  • 在我上一个代码 sn-p 中,resource 行命名控制器并定义您只需要通过获取/发布响应的索引(默认索引、新建、编辑等)。不,它不会选择“如果第一条路线丢失/错误,则下一条路线”。可以这样想,索引是先创建的,优先级高于登录。
  • 如果您想了解更多关于 Rails 路由的信息,请访问this guide。我还是新手,如果不绕圈子,我无法进一步解释。
  • @MohammadAreebSiddiqui 问题的进展如何?一切正常吗?
【解决方案2】:

在你的 LoginController 上添加一个索引操作

def index
end

【讨论】:

  • 但是为什么呢?我不需要索引操作。
  • 然后路由到你想要的操作get '/login', to: 'login#login'
  • 另外,您可能还想阅读guides.rubyonrails.org/routing.html 以了解路由的工作原理。
  • 默认路由命中给定的路径,即 google.com/login 在登录控制器中查找索引操作。如果你想路由登录而不是你需要指定。
【解决方案3】:

这将为您提供所需的结果。本地主机:3000/登录/登录。最后记得重启服务器。

app/controller/login_contrtoller.rb

class LoginController < ApplicationController
  def login
  end
end

路线

get 'login/login'

/app/views/login/login.html.erb

<h1>Login#login</h1>
<p>Find me in app/views/login/login.html.erb</p>

【讨论】:

  • 我不太明白你在说什么。
  • 控制器文件 login_controller 应该在 /app/controller/login 文件夹中,而 login.HTML.erb 文件应该在登录控制器的 app/views/login 中。如果您在终端中运行 rake routes 命令,它将显示 rails 认为已设置的所有路由。它可能不像您想象的那样指向登录/登录。尝试在移动控制器之前先确保视图位于 app/view golder 中,控制器中是否有“def index end”功能?
  • 将控制器移动到新文件夹时出现错误。
  • 在路由中试试这个。获取'登录/登录',:控制器 => '登录'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-28
  • 2017-09-29
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
相关资源
最近更新 更多