我目前正在rails中尝试restful_authentication。这是我的routes.rb文件
ActionController::Routing::Routes.draw do |map|
map.logout '/logout', :controller => 'sessions', :action => 'destroy'
map.login '/login', :controller => 'sessions', :action => 'new'
map.register '/register', :controller => 'users', :action => 'create'
map.signup '/signup', :controller => 'users', :action => 'new'
map.resources :users
map.resource :session
map.resources :products
这是我的SessionsController,它处理登录和注销
class SessionsController < ApplicationController
# render new.erb.html
def new
end
def create
logger.error("Inside create")
logout_keeping_session!
user = User.authenticate(params[:login], params[:password])
if user
# Protects against session fixation attacks, causes request forgery
# protection if user resubmits an earlier form using back
# button. Uncomment if you understand the tradeoffs.
# reset_session
self.current_user = user
new_cookie_flag = (params[:remember_me] == "1")
handle_remember_cookie! new_cookie_flag
redirect_back_or_default('/')
flash[:notice] = "Logged in successfully"
else
note_failed_signin
@login = params[:login]
@remember_me = params[:remember_me]
render :action => 'new'
end
end
def destroy
logout_killing_session!
flash[:notice] = "You have been logged out."
redirect_back_or_default('/')
end
protected
# Track failed login attempts
def note_failed_signin
flash[:error] = "Couldn't log you in as '#{params[:login]}'"
logger.warn "Failed login for '#{params[:login]}' from #{request.remote_ip} at #{Time.now.utc}"
end
end
我注意到没有索引操作。因此http://localhost:3000/sessions应该抛出一个未知的动作错误。然后我进入了登录页面,即:sessionscontroller中的新动作。我查找了表单提交网址,我发现它是
并且在提交萤火虫中显示的网址时
如何将网址重定向到正确的操作?即http://localhost:3000/sessions至http://localhost:3000/sessions/new
答案 0 :(得分:1)
您的map.resource session
行会自动创建静止路由,其操作匹配如下:
Verb Path Action
------------------------------
GET /session/new new
POST /session create
GET /session show
GET /session/edit edit
PUT /session update
DELETE /session destroy
由于它是一个单一资源,所有路径都使用/session
,而不是/sessions
,因此对GET
的{{1}}请求将失败。此外,对/sessions
的{{1}}请求将触发GET
操作,而不是/session
操作(单个资源没有show
操作)。
查看http://guides.rubyonrails.org/routing.html处的“奇异资源”部分(适用于Rails 3,但仍然适用相同的想法)。