2017-03-07 5 views
0

コントローラー以外の.rbファイル内にsession変数を使用することはできますか?レールでセッションにグローバルにアクセスする

私はこのfacebook messenger rails gemを使用してボットを構築しています。すべてのリクエストはapp/bot/listen.rbになります。

require "facebook/messenger" 
extend ActionView::Helpers # I need also the session 
include Facebook::Messenger 

Bot.on :message do |message| 
    session[:demo] = 1 
    puts "Your session number is: #{session[:demo]}" 
end 

モジュール:: DelegationError(controller.sessionに委任ActionView ::ヘルパー:: ControllerHelperの#セッションが、コントローラがnil:メイン)

はそれが可能であることをlisten.rbファイルでそのlisten.rbファイル内からセッションにデータを保存するには?

答えて

1

UserInfoモジュールは、Userオブジェクトの読み書きとスレッドローカルからのカプセル化をカプセル化します。このモジュールは、簡単にアクセスできるように他のオブジェクトと混在させることができます。

module UserInfo 
    def session 
    Thread.session 
    end 

    def self.session=(session) 
    Thread.session = session 
    end 
end 

任意のコントローラでアクションが呼び出される前に、ApplicationControllerのbefore_filterが呼び出されます。あなたは、HTTPセッションのタイムアウト値をコピーして、ローカルのスレッドでそれを設定するためにこれを利用することができます

class ApplicationController < ActionController::Base 
    before_filter :set_user 

    protected 
    # Sets the current user into a named Thread location so that it can be accessed by models and observers 
    def set_user 
    UserInfo.session = session[:user] 
    end 
end 

あなたはあなただけのミックスインすることができ、それらの値にアクセスする必要があるモデルクラスの任意の時点で、ヘルパーモジュールを使用して、そのメソッドを使用してデータにアクセスします。この最後の例では、UserInfoモジュールをモデルにミックスして、current_userメソッドにアクセスできるようになりました。

class Account < ActiveRecord::Base 
    include UserInfo 

    after_update :log_audit_change 

    private 
    def log_audit_change 
    Audit.audit_change(current_user, self.id, self.new_balance) 
    end 
end 
関連する問題