为什么我的控制器一直将我的 link_to 路由到 "show" 操作? Rails 4
Why does my controller keep routing my link_to toward "show" action? Rails 4
所以我很困惑。我是 Rails 上 Ruby 的新手(我正在使用 Rails 4),过去两天我一直在努力弄清楚为什么我的 link_to
标签一直在路由我的login
改为 show
。我从控制器中删除了 show
操作,甚至删除了 show.html.erb
,但 Rails 仍然坚持尝试将其路由到不再存在的 show
操作。
我删除了所有 redirect_to
函数,我创建的 link_to
将我带到正确的页面 localhost:8000/users/login
但现在显示错误 Unknown Action: The action 'show' could not be found for UsersController
.
我已经阅读了其他类似的 SO 问题,有些人认为这可能是 jquery_ujs
的问题,我将其从我的文件中删除以查看是否是问题所在,但我仍然结束了得到相同的结果。
我的views
目录下的文件如下:
- 观看次数
- 用户
- new.html.erb
- login.html.erb
我的代码如下所示:
users/new中的link_to
(new.html.erb)
<li><%= link_to "Login", users_login_path %></li>
routes.rb
resources :users
root 'users#new'
get 'users/create'
get 'users/login'
users_controller.rb
class UsersController < ApplicationController
def new
end
def create
@user = User.create(:username => params[:username], :password => params[:password])
@user.save
@users = User.all
end
def login
@message = "Success"
end
end #end class
login.html.erb(只是在此处测试输出以查看它是否到达此页面)
<h3><%= @message %></h3>
rake 路由命令的输出
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
root GET / users#new
users_create GET /users/create(.:format) users#create
users_login GET /users/login(.:format) users#login
我知道问题出在哪里了:
我需要从 routes.rb
文件中删除 resources :users
。
现在一切正常。在做了一些研究之后,似乎 resources :users
的问题在于当浏览器尝试访问页面时,他们尝试使用 HTTP 方法执行命令,该方法是 GET
, POST
, PUT
, DELETE
, 或 PATCH
.
当页面查找传入命令(在本例中为 GET /users/login
)时,它会尝试将其映射到控制器操作。如果第一个匹配的路由是 resources :users
,它将把它发送到 show
动作。
这似乎是由于默认的 CRUD 系统 Rails 使用每个 HTTP 方法代表一个 CRUD 操作(如果我错了请纠正我):
GET is show
POST is create
DELETE is destroy
PATCH is update
我从 Rails Routing from the Outside In, Section 2.1 获得了大部分研究。
所以我很困惑。我是 Rails 上 Ruby 的新手(我正在使用 Rails 4),过去两天我一直在努力弄清楚为什么我的 link_to
标签一直在路由我的login
改为 show
。我从控制器中删除了 show
操作,甚至删除了 show.html.erb
,但 Rails 仍然坚持尝试将其路由到不再存在的 show
操作。
我删除了所有 redirect_to
函数,我创建的 link_to
将我带到正确的页面 localhost:8000/users/login
但现在显示错误 Unknown Action: The action 'show' could not be found for UsersController
.
我已经阅读了其他类似的 SO 问题,有些人认为这可能是 jquery_ujs
的问题,我将其从我的文件中删除以查看是否是问题所在,但我仍然结束了得到相同的结果。
我的views
目录下的文件如下:
- 观看次数
- 用户
- new.html.erb
- login.html.erb
- 用户
我的代码如下所示:
users/new中的link_to
(new.html.erb)
<li><%= link_to "Login", users_login_path %></li>
routes.rb
resources :users
root 'users#new'
get 'users/create'
get 'users/login'
users_controller.rb
class UsersController < ApplicationController
def new
end
def create
@user = User.create(:username => params[:username], :password => params[:password])
@user.save
@users = User.all
end
def login
@message = "Success"
end
end #end class
login.html.erb(只是在此处测试输出以查看它是否到达此页面)
<h3><%= @message %></h3>
rake 路由命令的输出
Prefix Verb URI Pattern Controller#Action
users GET /users(.:format) users#index
POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
PATCH /users/:id(.:format) users#update
PUT /users/:id(.:format) users#update
DELETE /users/:id(.:format) users#destroy
root GET / users#new
users_create GET /users/create(.:format) users#create
users_login GET /users/login(.:format) users#login
我知道问题出在哪里了:
我需要从 routes.rb
文件中删除 resources :users
。
现在一切正常。在做了一些研究之后,似乎 resources :users
的问题在于当浏览器尝试访问页面时,他们尝试使用 HTTP 方法执行命令,该方法是 GET
, POST
, PUT
, DELETE
, 或 PATCH
.
当页面查找传入命令(在本例中为 GET /users/login
)时,它会尝试将其映射到控制器操作。如果第一个匹配的路由是 resources :users
,它将把它发送到 show
动作。
这似乎是由于默认的 CRUD 系统 Rails 使用每个 HTTP 方法代表一个 CRUD 操作(如果我错了请纠正我):
GET is show
POST is create
DELETE is destroy
PATCH is update
我从 Rails Routing from the Outside In, Section 2.1 获得了大部分研究。