与路由混淆

时间:2011-08-19 13:31:43

标签: ruby-on-rails routing restful-authentication

我目前正在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中的新动作。我查找了表单提交网址,我发现它是 enter image description here 并且在提交萤火虫中显示的网址时 enter image description here

如何将网址重定向到正确的操作?即http://localhost:3000/sessionshttp://localhost:3000/sessions/new

1 个答案:

答案 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,但仍然适用相同的想法)。