我做了很多研究,但找不到任何类似的问题/答案,因此非常感谢您的帮助。
我的应用程序在本地运行良好,但是当我推送到 Heroku 时,它会阻塞我的 session 变量。具体来说,当我尝试访问 session 中保存的对象的属性时,它会为 nil:NilClass 抛出一个 NoMethodError。在切换到参数并取得成功后,我将其缩小到 session 。但是,我更喜欢使用 session ,因为它使我的代码更清晰一些。
我四处寻找,似乎每个 session 对象都会发生这种情况。快速上下文是我创建一个新的负责人,然后是一个新的组织,然后将负责人与组织相关联。
协议(protocol)是 https(这是一个结帐页面)并且这些调用是通过 jQuery 异步发生的,但我不确定这是否重要。 rails 3.2。 Heroku 上的 Cedar/Postgres。 Sqlite3/Thin 本地。
Heroku 上的 session 发生了什么?
生产.rb
config.session_store :cookie_store, :key => '_my_app_session', :domain => :all
应用程序 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):
最佳答案
当您使用 new
实例化记录时,记录在保存之前不会持久保存到数据库中,并且在保存之前不会为记录分配 ID。
在您的代码中:
def create
@charge = Charge.new(params[:charge])
session[:current_charge_id] = @charge.id
...
end
@charge.id
此时为 nil,因此不会有 id。您需要在 charges_controller.rb 中使用 create
为记录提供一个 id:
def create
@charge = Charge.create(params[:charge])
session[:current_charge_id] = @charge.id
...
end
或者使用您现有的代码并在设置 session key 之前添加一个保存:
def create
@charge = Charge.new(params[:charge])
@charge.save
session[:current_charge_id] = @charge.id
...
end
关于ruby-on-rails - Heroku 上的 Rails : session variables nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21591079/