2012-01-17 4 views
8

私はRails 3とDeviseを使ってユーザーがWebサイトにアクセスし、ログインフォームとサインアップフォームを含むホームページを表示するアプリケーションを作成しています。このページには、独自のコントローラ(「ホームページ」)を持っているので、ルートは、私は、ユーザーがすでにログインしている場合は、別のホームページを表示したいRails 3 with Devise:ユーザーが認証されているかどうかに基づいて2つの別個のホームページを設定する方法は?

root :to => "homepage#index" 

あるのです。これは

root :to => "dashboard#index" 
へのルートポイントを有することに会計処理します

routes.rbに条件付きルートを設定する方法はありますか?そうすれば、ユーザーがそれらのホームページにルーティングする前に認証されているかどうかを確認できますか?

次のコードを使用してみましたが、ログインしていない場合は、ログインするように求められます。最初のルートのみが動作するようにしてください。

authenticate :user do 
    root :to => "dashboard#index" 
end 
    root :to => "homepage#index" 

www.example.com/dashboard/indexとwww.example.com/homepage/indexがに表示されたことがないように、また、私は、URLが両方のケースでwww.example.comを指すようにしたいですブラウザ。

ありがとうございます。あなたにHomeControllerで

答えて

13

はこれを試してみてください、それはしかし、ワーデン/考案する特有のです。

root to: "dashboard#index", constraints: lambda { |r| r.env["warden"].authenticate? } 
root to: "homepage#index" 
+0

ありがとう@ブラッドリー、これは私を殺していた:) –

+0

私は同じことをやっているが、ログインしたユーザーとログインしていないユーザーの両方がダッシュボード#index –

+1

警告:これはRails 4ではうまくいきません: '無効なルート名、すでに使用中: 'root'' – Happynoff

5

def index 
    if !user_signed_in? 
    redirect_to :controller=>'dashboard', :action => 'index' 
    end 
end 
+0

返信@negarnilありがとう。問題は、このオプションを試しましたが、URLを書き換えないことです。 www.example.comが両方のページを指してwww.example.com/dashboard/indexが表示されないようにします。 –

+0

レンダリングを試してください:action => 'dashboard.html.erb。 http://guides.rubyonrails.org/layouts_and_rendering.html#wrapping-it-up –

2

(正確に同じ質問への答え:https://stackoverflow.com/a/16233831/930038他人の参考のためにここにも答えを追加。。)

あなたroutes.rbで:

authenticated do 
    root :to => 'dashboard#index' 
end 

root :to => 'homepage#index' 

これはすべてのためのroot_urlが認証することを保証しますユーザーはdashboard#index

参考:https://github.com/plataformatec/devise/pull/1147

+0

Rails 4ではこれは動作しません。あなたは2つのルートの1つをリネームする必要があります。私の[回答](http://stackoverflow.com/a/19090936/1836143)を参照してください。 –

2

は、ここで私は受け入れ答えを編集/にこれを追加しようとしましたレール

root to: 'dashboard#index', constraints: -> (r) { r.env["warden"].authenticate? }, 
     as: :authenticated_root 
root to: 'homepage#index' 

4で正解だが、それは明らかに受け入れられるために、編集のあまりです。とにかく、(ブラッドリーからの)受け入れられた答えに投票し、それは私がこの1つを考え出すのを助けた:)

関連する問題