Rails登陆页面路由和设计

时间:2013-07-23 19:31:57

标签: ruby-on-rails devise ruby-on-rails-4 rails-routing

我的网站应该像facebook.com一样工作。 如果用户已登录,如果用户“/”,则应呈现主页控制器。如果未记录,则应呈现 landing_page 控制器

  

“/ ”&& user_signed_in? ---> 主页控制器

     

“/”&& user_not_logged ---> landing_page 控制器

我正在使用Rails 4和Devise

的ApplicationController

class ApplicationController < ActionController::Base

  before_filter :authenticate_user!
end

Routes.rb

get "landing_page/index"

root 'home#index', :as => :home

如何在ApplicationControl中保留“before_filter”,除了“landing_page”控制器之外,每个控制器都运行一次?

更新

如果我转到“/ en / landing_page”,它会正确渲染landing_page控制器(已注销),但如果我转到“/”它会将我重定向到“/ users / sign_in”

class LandingPageController < ApplicationController
  skip_before_action :authenticate_user!

  def index
  end

end

class ApplicationController < ActionController::Base

  before_action :authenticate_user!

end

的routes.rb

 root 'landing_page#index'

3 个答案:

答案 0 :(得分:8)

解决!

<强> LandingPageController

class LandingPageController < ApplicationController
  skip_before_action :authenticate_user!

  def index
  end

end

<强>的HomeController

class HomeController < ApplicationController
  skip_before_action :authenticate_user!
  before_action :check_auth

def check_auth
    unless user_signed_in?
        redirect_to :controller => :landing_page
    end
end
 end 

<强>的ApplicationController

class ApplicationController < ActionController::Base

  before_action :authenticate_user!

end

<强>的routes.rb

 root 'landing_page#index'

答案 1 :(得分:0)

我认为你可以轻松添加一个前置过滤器来处理这个动作。

就像这个answer

一样

答案 2 :(得分:0)

我认为你可以在控制器中写下confirm_logged_in函数动作

before_filter:confirm_logged_in

在该功能中,您可以根据登录用户

提及如何呈现页面
def confirm_logged_in<br>
  unless session[:user_id]
  flash[:notice] = 'Please log in.'
  redirect_to(:controller => 'access', :action => 'login')
  return false #halts the before_filter<

else
return true
  end
end