【问题标题】:Rails on Heroku: session variables nilHeroku 上的 Rails:会话变量 nil
【发布时间】:2014-03-02 16:48:31
【问题描述】:

我进行了大量研究,但找不到任何类似的问题/答案,因此感谢您的帮助。

我的应用在本地运行良好,但是当我推送到 Heroku 时,它会阻塞我的会话变量。具体来说,当我尝试访问会话中持有的对象的属性时,它会为 nil:NilClass 引发 NoMethodError。在切换到参数并取得成功后,我已将其缩小到会话。但是,我更喜欢使用会话,因为它可以让我的代码更简洁一些。

我四处寻找,似乎每个会话对象都在发生这种情况。快速上下文是我创建了一个新费用,然后是一个新组织,然后将费用与该组织相关联。

协议是 https(这是一个结帐页面),这些调用是通过 jQuery 异步发生的,尽管我不确定这是否重要。导轨 3.2。 Heroku 上的 Cedar/Postgres。 Sqlite3/Thin 本地。

Heroku 上的会话发生了什么?

生产.rb

config.session_store :cookie_store, :key => '_my_app_session', :domain => :all

application_controller.rb

...

helper_method :current_charge
def current_charge
  @_current_charge ||= session[:current_charge_id] &&
  Charge.find_by_id(session[:current_charge_id])
end

...

charges_controller.rb

def create
  @charge = Charge.new(params[:charge])
  if @charge.save
    session[:current_charge_id] = @charge.id
  ...
end

organizations_controller.rb

def create
  @organization = Organization.new(params[:organization])
  if @organization.save
    @charge = current_charge
    @charge.organization_id = @organization.id
    @charge.save!
  ...
end

Cedar 日志(在 organizations_controller.rb 上抛出)

NoMethodError (undefined method `organization_id=' for nil:NilClass):

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 session heroku


    【解决方案1】:

    当您使用new 实例化记录时,该记录在保存之前不会持久化到数据库中,并且在持久化之前不会为记录分配 id。

    在您的代码中:

    def create
      @charge = Charge.new(params[:charge])
      session[:current_charge_id] = @charge.id
      ...
    end
    

    @charge.id 此时为零,因此没有 id。您需要在您的charges_controller.rb 中使用create 为记录提供一个ID:

    def create
      @charge = Charge.create(params[:charge])
      session[:current_charge_id] = @charge.id
      ...
    end
    

    或者在设置会话密钥之前使用您现有的代码并添加保存:

    def create
      @charge = Charge.new(params[:charge])
    
      @charge.save
    
      session[:current_charge_id] = @charge.id
      ...
    end
    

    【讨论】:

    • 谢谢克里斯。我意识到了这个问题并修复了它,但正如我所提到的,这发生在所有会话对象上。它在本地工作,但不在 Heroku 上。还有其他想法吗?
    • 我唯一的另一个想法是更改您的辅助方法以将 current_charge_id 查找为字符串而不是符号...我之前遇到过会话哈希没有无关紧要的问题访问,因此它在设置属性时将符号转换为字符串,然后只能通过字符串访问。有意义吗?
    • 有道理,但没有运气:(
    猜你喜欢
    • 2012-01-22
    • 2013-08-02
    • 1970-01-01
    • 2012-10-02
    • 2015-08-16
    • 2015-02-10
    • 2014-05-17
    • 2016-09-22
    • 2015-01-23
    相关资源
    最近更新 更多