将rails应用程序部署到非root上下文 - restful_auth无法正常工作

时间:2010-02-02 00:40:15

标签: ruby-on-rails apache ruby-on-rails-plugins passenger

我在http://www.naildrivin5.com/scalatour上运行了一个rails应用程序。它工作正常。当我使用restful_authentication登录应用时,我会转到http://www.naildrivin5.com而不是应用。奇怪的。

这似乎是我错误配置了一些东西。此外,还有一些我正在手工创建一些网址的地方,我需要访问“应用程序上下文根”(即我的情况下为scalatour)以正确形成URL。我最终把它扔进了我的配置中,但这似乎不对。

Apache,使用Passenger,运行Rails应用程序:

Apache conf:

<VirtualHost 69.89.3.135:80> 
  DocumentRoot /somewhere/naildrivin5.com/html
  ServerName naildrivin5.com 
  RailsBaseURI /scalatour  
  PassengerPoolIdleTime 5 
  # other things not related
</VirtualHost>

passenger.conf

LoadModule passenger_module /usr/share/passenger/ext/apache2/mod_passenger.so 
PassengerRoot /usr/share/passenger 
PassengerRuby /usr/bin/ruby 
PassengerLogLevel 2 

/somewhere/naildrivin5.com/html/scalatour符号链接到我的Rails应用的public文件夹。

使用restful_authentication,该应用可以正常运行,除了进行身份验证。登录后,我被带到了Web服务器根目录,而不是应用程序根目录。

我应该如何/可以配置它,如何在运行时访问它,以及如何最好地配置我的本地开发环境来执行此操作(或不关心它)?

1 个答案:

答案 0 :(得分:4)

简答

  • relative_url_root
  • 中设置environments/production.rb
  • 在我的主页上创建一个名为“home”的路线
  • 修改脚手架restful_authentication代码以重定向到主页,而不是/

详细

如果您因suburi配置而遇到麻烦,则应在environment / production.rb文件中配置relative_url_root

config.action_controller.relative_url_root = "/scalatour"

在我看来,你在这里描述的问题是控制器/路由问题,可能的解决方案可能是下一个:

1)我会配置这些路线:

ActionController::Routing::Routes.draw do |map|
  [...]
  map.home 'home', :controller => 'welcome', :action => 'show'

  map.login "login", :controller => "user_sessions", :action => "new"

  map.logout "logout", :controller => "user_sessions", :action => "destroy"

  map.root :login
end

2)然后UserSessions控制器看起来像:

class UserSessionsController < ApplicationController
  before_filter :require_no_user, :only => [:new, :create]
  before_filter :require_user, :only => :destroy

  def new
    @user_session = UserSession.new
  end

  def create
    @user_session = UserSession.new(params[:user_session])
    if @user_session.save
      redirect_back_or_default home_path
    else
      flash[:error] = "Sorry, unrecognized username or password."
      render :action => :new
    end
  end

  def destroy
    current_user_session.destroy
    redirect_back_or_default login_url
    reset_session()
  end
  end

3)为了完整起见,方法“require_user”和“require_no_user”可以放在ApplicationController上,并且可以是:

  def require_user
    unless current_user
      flash[:error] = t("You must be logged-in to access this page")
      redirect_to login_path
      return false
    end
  end

  def require_no_user
    if current_user
      redirect_to home_path
      return false
    end
  end

祝你好运