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

hol*_*ard 2 forms controller ruby-on-rails ruby-on-rails-3 twitter-bootstrap

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

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

No route matches {:action=>"show", :controller=>"users"}
Run Code Online (Sandbox Code Playgroud)

用户控制器:

class UsersController < ApplicationController

  def index
    @users = User.all
  end

  def show
    ...
  end

  def login
    ...
  end

end
Run Code Online (Sandbox Code Playgroud)

_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>
Run Code Online (Sandbox Code Playgroud)

配置/ routes.rb文件:

get "home/index"

resources :users
resources :projects
resources :tickets

root :to => 'home#index'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我是Rails的新手,但发现奇怪的是它抱怨路由不存在,因为动作"show"是在用户控制器中找到的.

我想知道的另一件事是它为什么寻找动作"show",而在这种情况下它应该是"登录"?

为什么会这样,我该怎么办?

jvn*_*ill 5

你的错误在这一行

<%= form_for("user", :url => user_path) do |f| %>
Run Code Online (Sandbox Code Playgroud)

user_path期待一个id.如果你改变它users_path,那应该解决它,但我不认为这是你的意图.

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

resources :users do
  post :login, on: :collection, as: :login
end
Run Code Online (Sandbox Code Playgroud)

传递该:as选项会为您调用一个named_route login_users_path,您可以在其上使用它form_for.既然我们想做一个帖子,我们还需要在中指定form_for

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