2016-12-15 11 views
1

私はRails 5を使用しています。ヘルパーモジュールで定義した関数をconfnig/routes.rbファイルで認識させるにはどうすればよいですか?私のアプリ/ヘルパー/ sessions_helper.rbファイルでは、私はconfig/routes.rbファイルのヘルパーモジュールからメソッドを呼び出すにはどうすればよいですか?

# Returns true if the user is logged in, false otherwise. 
    def logged_in? 
    !current_user.nil? 
    end 

を持っているし、その後、私のconfig/routes.rbをファイルに私が

get '/', to: 'users#show', constraints: lambda { |request| SessionsHelper.logged_in? } 

しかし、私のアプリケーションをロードすると、私はエラーを取得していますがあります

undefined method `logged_in?' for SessionsHelper:Module 

私のモジュールからヘルパーメソッドを呼び出す正しい方法は何ですか?

答えて

3

これを行うことはできません。するべきではありません。あなたのルートファイルには、コントローラがの後に正しいコントローラがインスタンス化された後にコントローラによって提供された、現在のユーザの権限が保存されているセッションの概念がありません。認可は、あなたのルートファイルには、とにかく制約として属しません。

current_userが期待値に設定されていない場合は、コントローラーが422の「無許可」をレンダリングする責任があります。これはbefore_actionコールバックで行います。

class UsersController < ApplicationController 

    before_action :require_login 

    # ... 

    protected 

    def require_login 
    redirect_to login_path unless current_user 
    end 
end 

あなたは一般的に、あなたのApplicationControllerrequire_login機能とbefore_actionコールバックを配置し、その後skip_before_actionによる認証を必要としない選択ホワイトリストコントローラです。たくさんの宝石が既に存在しています。例えば、Deviseを参照してください。

+0

私の目標は、ユーザーがログインしている場合、誰かがルートを訪れたとき、彼らはにリダイレクトされるということですユーザーのホームページ。あなたの答えを読むことによって、私はそれをどのように達成するかについてはっきりしていません。 –

+0

@Natalia正しいコントローラの 'before_action'と' redirect_to'を使って、 'root'アクションを扱っているものとまったく同じです。 – meagar

+0

私はルートURL用にコントローラを設定していません。そのため、アプリケーションコントローラをデフォルトにするだけですか?それでも、この "before_action:require_login"を入れてみると、コントローラ内のすべてのアクションに適用されますが、それは私が望むものではありません。彼らがログインしている場合、私はルートパス( "/")からリダイレクトしたいだけです。そうでない場合は、そのようなリダイレクトをしますか? –

0

Deviseを使用していますか? yesの場合、あなたはこのようにそれを行う必要があります。工夫のコードで

authenticated 
    get '/', to: 'users#show' 
end 

詳細:https://github.com/plataformatec/devise/blob/master/lib/devise/rails/routes.rb#L294

+0

私が覚書を使用する場合、誰も私に依頼し続けているのはなぜですか?いいえ、私はしません。 –

+0

Devitsは認証に最も人気のあるRailsの宝石ですから。とにかく、あなたはdeviseのコードを見て、ワーキングラックのミドルウェアを挿入して認証状態に関する情報を得ることを理解することができます。 @meagarアドバイスを使うべきです。 –

関連する問題