【问题标题】:confusion with routing与路由混淆
【发布时间】:2011-08-19 21:46:02
【问题描述】:

我目前正在 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 应该抛出一个未知的操作错误,并且确实如此。然后我进入登录页面,即会话控制器中的 :new 操作。我查找了表单提交 url,我发现它是 并在提交萤火虫中显示的网址后

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

【问题讨论】:

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


    【解决方案1】:

    您的map.resource session 行会自动创建restful 路由,操作匹配如下:

    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,因此对/sessionsGET 请求将失败。此外,对/sessionGET 请求将触发show 操作,而不是index 操作(单个资源没有index 操作)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-04
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 1970-01-01
      • 2020-10-31
      • 1970-01-01
      相关资源
      最近更新 更多