Ответ 1
Этот пост объясняет, как достичь этого:
authenticated :user do
root :to => "main#dashboard"
end
root :to => "main#index"
Вот запрос pull, который реализует это с некоторыми техническими деталями
Я пишу приложение rails, в котором у меня есть редактор и модель публикации. Я использую программу для проверки подлинности редакторов, и поскольку редактор не может делать что-либо в качестве гостя, я написал специальный макет, который будет использоваться для страницы входа, и я хочу, чтобы гостевой пользователь мог видеть только страницу входа.
Теперь я пытаюсь выполнить следующее поведение в своем приложении, но безуспешно:
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
Основная проблема заключается в том, что я хочу избавиться от "вам нужно войти или зарегистрироваться, прежде чем продолжить". сообщение при посещении гостевого пользователя '/'.
Я попробовал с подсказками, взятыми из здесь и здесь, но без везения.
Какой-нибудь намек на то, как реализовать это с помощью разработки?
Спасибо.
Этот пост объясняет, как достичь этого:
authenticated :user do
root :to => "main#dashboard"
end
root :to => "main#index"
Вот запрос pull, который реализует это с некоторыми техническими деталями
Я думаю, вы должны использовать что-то вроде этого
authenticated :user do
root :to => 'users#index', as: :authenticated_root
end
root :to => 'welcome#index'
поскольку rails4 не позволяет маршрутам с одинаковым именем вам нужен, чтобы указать как:
authenticated :user do
root :to => 'home#index', :as => :authenticated_root
end
root :to => redirect('/users/sign_in')
Прямо от устья лошади на Как сделать драгоценный камень.: D
Также из-за того, что вам нужно назвать эти корневые пути в 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
Да, эта проблема была очень расстраивающей для меня.
В конечном итоге я просто скрыл флеш-сообщение на новой странице сеансов #. Не отличное решение вообще, поскольку иногда вы/делаете/хотите, чтобы это сообщение появилось.
Я сдался через некоторое время, но мне интересно, можете ли вы использовать этот подход, но установите некоторый флаг внутри этой лямбды и перед контроллером сессий должен иметь 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
Я не слишком хорошо разбираюсь в том, как работает ограничение маршрутов и объект запроса, а просто идея. Это отключит флэш-сообщение только тогда, когда вы пытаетесь получить доступ к "/", а не к другим страницам.
Надеюсь, у кого-то есть хорошее решение!