Различный корневой каталог '/' для пользователей в зависимости от того, прошли ли они аутентификацию (используя devise) - PullRequest
16 голосов
/ 20 апреля 2011

Я пишу приложение rails, в котором у меня есть редактор и модель публикации.Я использую devise для аутентификации редакторов и, поскольку редактор ничего не может сделать в качестве гостя, я написал собственный макет для использования на странице входа в систему и хочу, чтобы гостевой пользователь мог видеть только страницу входа в систему.

Сейчас я пытаюсь добиться следующего поведения в своем приложении, но безуспешно:

require 'spec_helper'
require 'capybara/rails'

describe "Authentication" do

  describe "when logged in" do
    before(:each) do
      @editor = Factory(:editor, :password => 'secret')
      visit '/'
      fill_in 'Login', :with => @editor.login
      fill_in 'Password', :with => 'secret'
      click_button 'Sign in'
      page.should have_content('Signed in successfully.')
    end

    it "getting / should render publication page with no redirection" do
      visit '/'
      page.should_not have_content('Login')
      page.should have_content('Publications')
      # assert that there is no redirection
      page.current_path.should == '/'
    end

    it "visits the sign_in page should redirect to /" do
      visit '/editors/sign_in'
      page.should have_content('Publications')
      page.current_path.should == '/'
    end

  end

  describe "when not logged in" do
    it "getting / should not display the sign in warning" do
      visit '/'
      # I want to get rid of this message
      page.should_not have_content('You need to sign in or sign up before continuing.')
    end

    it "getting / should not redirect to the sign_in default page" do
      visit '/'
      page.should have_content('Login')
      # assert that there is no redirection
      page.current_path.should == '/'
    end

    it "getting the the sign_in default path works" do
      visit '/editors/sign_in'
      page.should have_content('Login')
      page.current_path.should == '/editors/sign_in'
    end

    it "login works and redirect me to the publications page (with /)" do
      @editor = Factory(:editor, :password => 'secret')
      visit '/'
      fill_in 'Login', :with => @editor.login
      fill_in 'Password', :with => 'secret'
      click_button 'Sign in'
      page.should have_content('Signed in successfully.')
      page.current_path.should == '/'
      page.should have_content('Publications')
    end
  end
end

Основная проблема заключается в том, что я хочу избавиться от «Вам необходимо войти в систему или зарегистрироваться перед тем, как продолжить.'сообщение, когда гостевой пользователь посещает "/"о том, как реализовать это с помощью устройства?

Спасибо.

Ответы [ 5 ]

28 голосов
/ 02 июля 2014

Я думаю, вы должны использовать что-то подобное

authenticated :user do
  root :to => 'users#index', as: :authenticated_root
end
root :to => 'welcome#index'

, поскольку rails4 не разрешает маршруты с тем же именем, которое вам необходимо , чтобы указать как:

24 голосов
/ 04 ноября 2012

Этот пост объясняет, как этого добиться:

authenticated :user do
  root :to => "main#dashboard"
end

root :to => "main#index"

Вот запрос pull , который реализует это с некоторыми техническими деталями

6 голосов
/ 09 июля 2014
authenticated :user do
  root :to => 'home#index', :as => :authenticated_root
end
root :to => redirect('/users/sign_in')

Прямо изо рта лошади в Как это для драгоценного камня для разработки . : D

1 голос
/ 10 июля 2015

Также из-за того, что вам нужно назвать эти корневые пути в Rails 4, вы можете обнаружить, что это раздражает, если вы просто хотите использовать root_path для , скажем, ваш логотип , чтобы вы вернулись на панель управления или домашнюю страницу соответственно,Я только что создал помощников в ApplicationHelper, который решает это легко.

module ApplicationHelper
  def root_path
    if user_signed_in?
      authenticated_root_path
    else
      unauthenticated_root_path
    end
  end

  def root_url
    if user_signed_in?
      authenticated_root_url
    else
      unauthenticated_root_url
    end
  end
end
0 голосов
/ 20 апреля 2011

Да, этот вопрос меня тоже очень расстраивал.

В конечном итоге я просто спрятал флэш-сообщение на сессиях # новая страница.Совсем не лучшее решение, так как иногда вы / хотите / хотите, чтобы это сообщение появилось ..

Через некоторое время я сдался, но мне интересно, если вы можете использовать этот подход , ноустановите какой-либо флаг внутри этой лямбды и установите в контроллере сессий before_filter, который будет мигать, если он присутствует.Что-то вроде ...

#routes
=> 'users#dashboard', :constraints => lambda {|r| r.env["skip_flash"] = true; r.env["warden"].authenticate? }


#sessions_controller.rb
before_filter :only=>[:new] do
  flash[:notice] = nil if request.env["skip_flash"]
  request.env["skip_flash"] = false
end

Я не слишком знаком с тем, как работает ограничение маршрутов и объект запроса ... но просто идея.Это отключит флэш-сообщение, только когда вы пытаетесь получить доступ к "/", а не к другим страницам ..

Я надеюсь, у кого-нибудь есть хорошее решение!

...