没有路由匹配 {:action=>"show", :controller=>"users"}。

3
我正在尝试实现一个Twitter Bootstrap登录表单,该表单将在每个页面上使用(因为导航栏是布局的一部分)。
但是,在尝试下面的代码时,我收到以下错误:
No route matches {:action=>"show", :controller=>"users"}

用户控制器:

class UsersController < ApplicationController

  def index
    @users = User.all
  end

  def show
    ...
  end

  def login
    ...
  end

end

_navigation.html.erb:

<div class="dropdown-menu" style="padding: 15px; padding-bottom: 0px;">
    <%= form_for("user", :url => user_path) do |f| %>
        <%= f.label :email%>
        <%= f.text_field(:email, :size => 30, :class => 'login_field', :placeholder => 'Användarnamn')%>
        <%= f.label :password%>
        <%= f.text_field(:password, :size => 30, :class => 'login_field', :placeholder => 'Lösenord')%>

        <%= f.submit "Logga in", :class => 'login_submit btn btn-primary' %>
    <% end %>
</div>

config/routes.rb:

get "home/index"

resources :users
resources :projects
resources :tickets

root :to => 'home#index'

rake routes(与用户有关的):

该命令将显示与用户相关的所有路由。
    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
          PUT    /users/:id(.:format)         users#update
          DELETE /users/:id(.:format)         users#destroy

我刚开始学习Rails,但发现它报错说路由不存在,因为“show”操作应该在user controller中找到。

另一件让我困惑的事情是,为什么它要寻找“show”操作,而不是这种情况下应该是“login”操作?

为什么会出现这种情况,我该怎么办?


1
你的 config/routes.rb 文件长什么样? - Leo Correa
你能在控制台中执行 rake routes 命令并检查用户控制器登录操作的路径吗?如果登录是用户资源的集合操作,它应该类似于 login_users_path - Manoj Monga
3个回答

5

你的错误在这一行

<%= form_for("user", :url => user_path) do |f| %>

user_path需要一个id参数。如果您将其更改为users_path,那么应该可以解决问题,但我不认为这是您的意图。

更新:要使用用户控制器上的login操作,您需要更新路由。

resources :users do
  post :login, on: :collection, as: :login
end

传递:as选项会为您创建一个名为login_users_path的命名路由,您可以在form_for中使用它。由于我们想要进行提交(post),因此还需要在form_for中指定。

<%= form_for("user", :url => login_users_path, :html => { :method => :post }) do |f| %>

谢谢你的回答!我尝试了这段代码,但是出现了以下错误:"undefined local variable or method `login_path' for #<#Class:0x007f8556a37c98:0x007f8556f3a1c8>" - holyredbeard
1
抱歉,应该是 login_users_path,我忘记它是在资源下面的。 - jvnill

2

更新你的routes.rb文件,让它看起来像这样:

get "home/index"

resources :users do
  post :login, :on => :collection
end

resources :projects
resources :tickets

root :to => 'home#index'

在您的视图文件中,将form_for行更改为:

<%= form_for("user", :url => login_users_path) do |f| %>

1

resources :users 仅添加默认路由。如果您想添加新的操作(除了默认操作),则需要使用 'collection'。您可以指定方法 getpost。在添加到 routes.rb 后,您可以通过运行 rake routes 获取 path,然后将正确的路由添加到表单的 action 中。

   resources :users, :collection => {:login => :post}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接