Развернуть приложение rails в некорневом контексте - restful_auth не работает - PullRequest
5 голосов
/ 02 февраля 2010

Я запускаю приложение rails на http://www.naildrivin5.com/scalatour. Работает нормально. Когда я вхожу в приложение, используя restful_authentication, меня переводят в http://www.naildrivin5.com вместо приложения. Weird.

Кажется, я что-то неправильно настроил. Кроме того, есть несколько мест, где я вручную создаю несколько URL-адресов, и мне нужен доступ к «корню контекста приложения» (т.е. 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 является символической ссылкой на папку public моего приложения Rails.

Приложение работает нормально, кроме для аутентификации, используя restful_authentication. После входа в систему меня переводят в корневой каталог веб-сервера, а не в корневой каталог приложения.

Как / можно настроить это, как получить к нему доступ во время выполнения и как лучше всего настроить мою локальную среду разработки для этого (или не заботиться об этом)?

1 Ответ

4 голосов
/ 06 февраля 2010

Короткий ответ

  • настройка relative_url_root в environments/production.rb
  • создание маршрута "home" на мою домашнюю страницу
  • Изменение кода restful_authentication в лесах для перенаправления на дом вместо /

Подробнее

Если у вас возникли проблемы из-за конфигурации suburi, вам следует настроить lative_url_root в вашем файле environment / production.rb:

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

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...