当相同的代码在我的本地设置上完美地工作时,为什么我会在我的Heroku应用程序上得到NoMethodError ?
错误由以下代码触发:
@customer = Customer.find(1)
@customer.responses.create(:offer_id => '1', :digit => '2')
该代码在我的本地服务器和本地Rails控制台中按预期工作。
但是,在Heroku上,上面的代码会触发NoMethodError:
NoMethodError (undefined method `responses' for #<Customer:0x7f7bcbee3808>):
Response模型通过belongs_to: Customer 方法绑定到Customer模型另外,我可以登录到Heroku控制台并运行这个,没有任何问题:
Response.create(:offer_id => '1', :customer_id => '1', :digit => '2')
那么如果上面的工作和两个版本在我的本地机器上工作良好,为什么关联在Heroku上失败?
,
运行Rails 3.0.6并在Heroku Ruby 1.8.7和Ruby 1.9.2上测试
数据库在Heroku和我的本地盒子上是相同的。
通常当这样的东西不起作用时,它表明您缺少has_many
关联。如果您希望同时访问关联的belongs_to
和has_many
,则需要同时定义 。
听起来,如果它在您的本地机器上工作而不是Heroku,那么这可能是因为您没有将更改推送到Heroku服务器并重新启动那里的控制台。
Marco,我想了一下,我有一些猜测供你尝试。在你做这两件事之前,重启你的应用。有时候这会创造奇迹。
heroku restart
好的,现在,在控制台中输入
@customer.responses
返回什么?我想应该是[]
。也许做一些检查等可以给我们一些启示。如果您手动构建和关联响应,您能让它显示出来吗?
第二,你的no方法错误是在responses
上,而不是在create
上,所以无论你在那之后键入什么都可能无关紧要,但是,你的offer_id
和digit
字段是整数吗?如果是这样,请尝试使用整数而不是字符串创建它们。与MySQL或SQLite相比,PostgreSQL是如此脆弱,我有很多问题可以追溯到我在开发Heroku之前不熟悉PostgreSQL。
@customer.responses.create(:offer_id=>1,:digit=>3)
这可能无关紧要,但值得一试。
另一件要检查的事情是所有的回调和验证等。有什么失败的吗?这可能看起来无关紧要,但我之前遇到过一些问题,因为我忽略了回调中看似微小的无声失败,导致事情变得非常奇怪。我相信您正在进行测试,但是如果您在这个模型上的任何地方都有很浅的测试覆盖率,那么您不妨使用这个漏洞查找作为加强它的机会:)
对这个错误表示同情,我不知道这些是否有帮助,但是祝你好运!如果Heroku的工作人员发现了这个问题,请贴出来,我很有兴趣从中学习!我认为你的问题是如何创建响应:
@customer.responses.create(:offer_id => '1', :digit => '2')
你可以试试这个
Response.create(:offer_id => '1', :digit => '2', :customer_id => 1)