我做了很多研究,找不到任何类似的问题/答案,所以我很感激帮助。
我的应用在本地运行良好,但当我推送到Heroku时,它会阻塞我的会话变量。具体来说,当我尝试访问会话中保存的对象的属性时,它会为nil:NilClass抛出NoMethodError。在切换到params并取得成功之后,我已将其缩小到会议。但是,我更喜欢使用会话,因为它使我的代码更清洁。
我已经开玩笑了,似乎每个会话对象都会发生这种情况。快速上下文是我创建新的费用,然后是新的组织,然后将费用与组织联系起来。
协议是 https (这是一个结帐页面),这些调用是通过jQuery异步进行的,但我不确定这是否重要。 Rails 3.2。 Heroku上的雪松/ Postgres。 Sqlite3 / Thin本地。
Heroku上的会议发生了什么?
config.session_store :cookie_store, :key => '_my_app_session', :domain => :all
...
helper_method :current_charge
def current_charge
@_current_charge ||= session[:current_charge_id] &&
Charge.find_by_id(session[:current_charge_id])
end
...
def create
@charge = Charge.new(params[:charge])
if @charge.save
session[:current_charge_id] = @charge.id
...
end
def create
@organization = Organization.new(params[:organization])
if @organization.save
@charge = current_charge
@charge.organization_id = @organization.id
@charge.save!
...
end
NoMethodError (undefined method `organization_id=' for nil:NilClass):
答案 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