【问题标题】:Deploy rails app to non-root context - restful_auth not working将 Rails 应用程序部署到非 root 上下文 - restful_auth 不起作用
【发布时间】:2010-02-02 00:40:15
【问题描述】:

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

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

Apache 和 Passenger 一起运行 Rails 应用程序:

Apache 配置:

<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 服务器根目录,而不是应用程序根目录。

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

【问题讨论】:

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


    【解决方案1】:

    简答

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

    详情

    如果您因为 suburi 配置而遇到问题,您应该在您的环境/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
    

    最好的问候

    【讨论】:

    • 就是这样;我将编辑帖子以准确突出需要做什么。谢谢!
    • 很高兴能帮到你。谢谢你的总结!!
    猜你喜欢
    • 2023-03-25
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 2015-12-25
    • 2014-11-11
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多