【问题标题】:Unable to set/use session variables in ruby on rails controller无法在 ruby​​ on rails 控制器中设置/使用会话变量
【发布时间】:2014-07-01 03:33:59
【问题描述】:

谁能告诉我在 ruby​​ on rails 应用程序中从头开始设置/使用会话变量的正确方法。我无法在两个页面之间的控制器中设置/使用会话变量。我正在使用 CookieStore 会话类型。这是用于设置和获取会话变量的语法:

session[:test] = "testing"

@test_str = session[:test]

如果我遗漏了什么,请告诉我。

这是我的控制器的样子:

class PaymentsController < ApplicationController

  # GET /merchant_test  
  def merchant_test
    session[:test] = "testing"
    render :layout => false 
  end

  # POST /post_to_mobikwik
  def post_to_mobikwik
    zr = Mobikwik::Request.new(params) 
    @mobikwik_data = zr.all_params
    @test_str = session[:test]
    render :layout => false    
  end

  # POST /z_response
  def z_response
    zr = Mobikwik::Response.new(request.raw_post)  
    @checksum_check = zr.valid?
    @mobikwik_post = zr.all_params
    @statuscode = @mobikwik_post['statuscode']
    @statusmessage = @mobikwik_post['statusmessage']
    if @statuscode == "0"
       @verified = zr.verified?
    else
       @verified = false
    end
    render :layout => false
  end

【问题讨论】:

  • 对我来说看起来很好,当你这样做时会发生什么。周围的代码是什么。给我们一个不起作用的完整示例。你检查过documentation for session吗?
  • 嗨,马特,当我尝试从会话中取回值时,我得到一个 nil 值。
  • 也添加了控制器。
  • 您可以使用浏览器检查 cookie,它应该包含您的 test 条目。如果没有,您的 cookie 可能包含太多信息(限于 4K)。它可能失败的另一个原因是您的会话以某种方式被重置。该信息将在 cookie 中,但不在会话中(因为它已被清除)。在before_action/filter 的某处查找reset_session 命令(例如,它通常在登录后完成以禁用会话固定)。
  • 错误不在您在此处发布的代码中。它很可能在某处的配置或其他非本地影响中。 @nathanvda 的建议是最好的:首先检查浏览器中的 cookie,它将被加密,但您至少可以查看它是否被设置。这是将问题一分为二的第一步——确定问题出在设置还是得到。 ...另一个随机想法:如果为 cookie 设置了 Secure 标志并且您正在混合 http/https 请求。

标签: ruby-on-rails ruby session


【解决方案1】:

根据经验,我们在 rails 中创建一个方法 在 ApplicationController 中,称为current_userthis 免费的 RailsCast 中,您可以看到您到底需要什么:

【讨论】:

  • 我没有使用 active_record_store。我正在使用 cookie_store 会话管理。据我了解,不需要创建任何方法。我们应该能够直接向会话数组添加参数,并且应该能够从中获取相同的参数。但它没有发生在我的应用程序中。
【解决方案2】:

config/initializers/session_store.rb试试这个

AppName::Application.config.session_store :cookie_store, key: '_app-name_session'

【讨论】:

  • 这是我的 session_store.rb 文件 MobikwikDemo::Application.config.session_store :cookie_store, key: '_mobikwik-demo_session'
  • 您的应用是mobikwik-demo 还是mobikwik_demo
  • mobikwik-demo 是我的应用程序。虽然我的应用程序的名称是 MobikwikDemo。这会带来改变吗?
  • 我有像你一样的代码,但应用程序名称如-app_name 带有下划线,而不是破折号。我认为这是唯一的变化......
  • 好的。谢谢你的建议。我会试试这个。
【解决方案3】:

您的会话 cookie 设置可能有误。您应该检查响应的标头并查看 Set-Cookie 标头的外观。

它可能有一个错误的域,或者您的 cookie 可能只是 https 并且您在 http 上。

配置通常在 config/initializers/session_store.rb 之类的地方完成

Myapp::Application.config.session_store :cookie_store, {
  :key =>           '_appname_session_id',
  :path =>          '/',
  :domain =>        nil,   # accepted domain, for example '.example.com'  
  :expire_after =>  nil,   # the session will be expired in X seconds unless active
  :secure =>        false, # if true, cookie is valid only on https
  :httponly =>      true   # if true, javascript can't access the cookie
}

【讨论】:

  • 嗨,kimmmo,感谢您的回复。我尝试实施您的建议,但它似乎对我也不起作用。仍然无法在同一个控制器的另一个函数中获取存储在一个控制器函数中的会话参数。
猜你喜欢
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多