19

セッション ID 情報を使用する必要があるアプリケーションに取り組んでいます。私のセッションは Cookie に保存されます。私が抱えている問題は、ユーザーが初めてサイトにアクセスしたときに、コントローラーがセッションをすぐに利用できないことです。Rails でのセッションの初期化方法について、何かが欠けているのではないかと思います。しかし、これは次の出力であるため、セッションがロードされていないという事実については肯定的ですsession.inspect

#<Rack::Session::Abstract::SessionHash:0x15cb970 not yet loaded>

Rails 3.2.11とで問題を再現する方法は次のruby 1.9.3とおりです。

testコントローラーを使用して新しいアプリケーションを作成します。

rails new my_app
cd my_app/
rails g controller test
rm app/assets/javascripts/test.js.coffee
touch app/views/test/index.html.erb

そのコントローラーでセッション ID を取得してみてください。

class TestController < ApplicationController
  def index
    puts session[:session_id]
    puts session.inspect
  end
end

必要なルートを追加します。

MyApp::Application.routes.draw do
  resources :test
end

次に、アプリケーションにアクセスして、その機能を確認します。

rails server

に行きました:http://localhost:3000/test

それはコンソールの出力です:

#<Rack::Session::Abstract::SessionHash:0x3fd10f50eea0 not yet loaded>

それからまたhttp://localhost:3000/test、今回はセッションがあります。

400706c0b3d95a5a1e56521e455075ac
{"session_id"=>"400706c0b3d95a5a1e56521e455075ac", "_csrf_token"=>"Euaign8Ptpj/o/8/ucBFMgxGtiH7goKxkxeGctumyGQ="}
4

5 に答える 5

24

セッションの初期化を強制する方法を見つけました。セッションへのアクセスは明らかに初期化を強制しませんが、セッションへの書き込みは強制します。私がコントローラーでやっていることは今これです:

class MyController < ApplicationController
  protect_from_forgery
  def index
    session["init"] = true
    do_stuff
  end
end

これが Rails の通常の動作と見なされるべきかどうかはまだわかりません。初期化を強制するためにセッションに書き込む必要があるのは、私には正しくありません。読むだけで十分です。

于 2013-02-04T09:53:02.947 に答える
7

ActionDispatch::Sessionからの関連コードを次に示します。

 def [](key)
    load_for_read!
    @delegate[key.to_s]
  end

  private

  def load_for_read!
    load! if !loaded? && exists?
  end

これは、 を介してキーで任意の値にアクセスするとすぐに、セッション オブジェクトがロードされることを意味します[]

于 2013-02-02T20:24:54.773 に答える
0

あなたの質問がよくわかりません。ユーザーがサイトにアクセスする前に登録またはサインインする必要がある場合、問題はありません。ユーザーを作成すると、その情報はすぐに Cookie に保存されます。例えば:

ユーザーコントローラー: (登録は users#new で行います)

def create
   @user = User.new(params[:user])
   if @user.save
     cookies.permanent[:remember_token] = user.remember_token
     redirect_to root_path, notice: "Thank you for registering!"
   else
     render :new
   end
 end

セッション コントローラー: (サインインは、sessions#new を介して行われます)

 def create
  user = User.find_by_email(params[:session][:email].downcase)

  if user && user.authenticate(params[:session][:password])
    cookies.permanent[:remember_token] = user.remember_token
    redirect_to root_path, notice: "Logged in."
  else
    flash.now.alert = "Email or password is incorrect."
    render :new
 end
end
于 2013-02-02T19:47:48.460 に答える