我正在尝试实施一个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>
配置/ routes.rb中:
get "home/index"
resources :users
resources :projects
resources :tickets
root :to => 'home#index'
佣金路线(与用户有关):
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”动作。
我想知道的另一件事是为什么它会寻找动作“show”,而在这种情况下它应该是“登录”?
为什么会这样,我该怎么办?
答案 0 :(得分: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
的named_route,您可以在form_for
上使用该名称。{1}}。由于我们想要发帖,我们还需要在form_for
<%= form_for("user", :url => login_users_path, :html => { :method => :post }) do |f| %>
答案 1 :(得分: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| %>
答案 2 :(得分:1)
resources :users
仅添加默认路由。如果要添加新操作(除了默认设置之外),则需要使用“collection
。您可以指定方法get
或post
。添加到routes.rb
后。您可以通过运行path
获取rake routes
,然后在表单的action
中添加正确的路由。
resources :users, :collection => {:login => :post}