2011-08-19 142 views
1

我目前正在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中的新动作。我抬头对表单提交的url,我发现它是 enter image description here 并在提交的萤火显示的URL是 enter image description here

怎么的URL重定向到正确的行动?

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:即http://localhost:3000/sessionshttp://localhost:3000/sessions/new

回答

1

map.resource session线如下自动创建REST风格的路线,匹配了行动要求/sessions将失败。此外,GET请求/session将触发show操作,而不是index操作(单个资源没有index操作)。

查看http://guides.rubyonrails.org/routing.html的“奇异资源”部分(它适用于Rails 3,但仍然适用相同的想法)。

+0

Thanx。这帮了很多.. – Rahul