Heroku上的Rails:会话变量为nil

时间:2014-02-05 23:42:26

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

我做了很多研究,找不到任何类似的问题/答案,所以我很感激帮助。

我的应用在本地运行良好,但当我推送到Heroku时,它会阻塞我的会话变量。具体来说,当我尝试访问会话中保存的对象的属性时,它会为nil:NilClass抛出NoMethodError。在切换到params并取得成功之后,我已将其缩小到会议。但是,我更喜欢使用会话,因为它使我的代码更清洁。

我已经开玩笑了,似乎每个会话对象都会发生这种情况。快速上下文是我创建新的费用,然后是新的组织,然后将费用与组织联系起来。

协议是 https (这是一个结帐页面),这些调用是通过jQuery异步进行的,但我不确定这是否重要。 Rails 3.2。 Heroku上的雪松/ Postgres。 Sqlite3 / Thin本地。

Heroku上的会议发生了什么?

production.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 log(在organizational_controller.rb上抛出)

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

1 个答案:

答案 0 :(得分:1)

使用new实例化记录时,记录在保存之前不会持久存储到数据库中,并且在记录保留之前不会为记录分配任何ID。

在您的代码中:

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

@charge.id为零,因此不会有ID。您需要在charge_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