【问题标题】:Why does my controller keep routing my link_to toward "show" action? Rails 4为什么我的控制器不断将我的 link_to 路由到“显示”操作?导轨 4
【发布时间】:2015-02-06 07:58:24
【问题描述】:

所以我很困惑。我是 Ruby on Rails 的新手(我使用的是 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 (new.html.erb) 中的link_to

<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 routes 命令的输出

    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

【问题讨论】:

  • 发布rake routes命令的结果
  • @RSB 现在按要求添加了。

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


【解决方案1】:

我发现了问题所在:

我需要从 routes.rb 文件中删除 resources :users

现在一切都按预期工作。在做了一些研究之后,似乎存在resources :users 的问题在于,当浏览器尝试访问页面时,他们尝试使用 HTTP 方法执行命令,即GETPOSTPUTDELETEPATCH

当页面查找传入命令(在本例中为 GET /users/login)时,它会尝试将其映射到控制器操作。如果第一个匹配的路由是resources :users,它将发送到show action。

这似乎是由于 Rails 使用的默认 CRUD 系统,其中每个 HTTP 方法都代表一个 CRUD 操作(如果我错了,请纠正我):

GET is show
POST is create
DELETE is destroy
PATCH is update

我从Rails Routing from the Outside In, Section 2.1 获得了大部分研究。

【讨论】:

  • 不要将 HTTP 动词与特定的 CRUD 操作混淆(并非总是如此)。当然,DELETE 是破坏,POST 通常是创建,但通常用于“简单”创建之外,PUT/PATCH 是更新,但糟糕的旧 GET 几乎是任何东西 - 索引视图是对 GET 的响应,显示是对 GET 的响应,任何东西都可以是对 GET 的响应,只要该操作是幂等的(在服务器端不会改变任何东西)。
  • @railsdog 我想可能是因为我的view/users 文件夹缺少index.html.erb 文件,它可能已将GET 请求映射到show,但我不能确定(好吧,我确实说过“如果我错了,请纠正我”!)。我现在实际上正在阅读以了解为什么它可能是 GET 映射到 show。稍后我会为大家发布我的发现。
  • 路由工作基于 HTTP 方法和 URL 的模式匹配的组合。使用您的 routes.rb GET users/1 和 GET users/login 中的资源 :users 都将匹配路由中作为 GET 方法的第一个路由,并且看起来像“users/something”。就路由而言,“1”可以是“某物”,“登录”可以是“某物”,第一个匹配的路由就是节目。如果将资源 :users 放在自定义路由之后会发生什么? IIRC,在这种情况下,您的 users/login 将仅匹配 users/login,而 users/1 应匹配 show route。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多