【问题标题】:No route matches {:action=>"show", :controller=>"users"}没有路线匹配 {:action=>"show", :controller=>"users"}
【发布时间】:2013-02-06 14:39:00
【问题描述】:

我正在尝试实现一个 Twitter Boostrap 登录表单,它将在每个页面上使用(因为导航栏是布局的一部分)。

但是,在尝试下面的代码时,我收到以下错误:

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 路线(与用户有关):

    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”,而在这种情况下它应该是“login”?

为什么会发生这种情况,我该怎么办?

【问题讨论】:

  • 您的config/routes.rb 文件是什么样的?
  • 您能否在控制台中执行rake routes 并检查用户控制器的登录操作路径是什么。如果登录是用户资源的收集操作,它应该类似于login_users_path

标签: ruby-on-rails ruby-on-rails-3 forms twitter-bootstrap controller


【解决方案1】:

你的错误在这一行

<%= 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 上使用它。既然我们想做一个帖子,我们还需要在form_for中指定它

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

【讨论】:

  • 感谢您的回答!我尝试了代码,但收到以下错误:“#:0x007f8556f3a1c8> 的未定义局部变量或方法 `login_path'”
  • 抱歉应该是login_users_path,忘记在资源下
【解决方案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| %>

【讨论】:

    【解决方案3】:

    resources :users 只添加默认路由。如果要添加新操作(除默认值之外),您需要使用 'collection。并且您可以指定方法getpost。添加到routes.rb后。您可以通过运行rake routes 获得path,然后在action 表单中添加正确的路线。

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

    【讨论】:

      猜你喜欢
      • 2012-07-22
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多