可以访问ActiveRecord对象,但不能访问其属性
我在使用form_for
和nested_form_fields
在Rails中呈现视图。在这里,@procedure_step
是一个记录,has_many :procedure_step_actions
,其中每个belongs_to :error
,这是一个ProcedureError
(与其他模型之间的某些关系)整数:code
,我试图访问并打印到页面。这是我的模板:可以访问ActiveRecord对象,但不能访问其属性
<%= form_for @procedure_step do |f| %>
<%= f.nested_fields_for :procedure_step_actions do |act| %>
<%= act.object.error.code %>
<% end %>
<% end %>
当我运行这个,我得到undefined method 'code' for nil:NilClass
。好吧,我的关系搞砸了,我不能访问act.object.error
,对吧?改变我的模板来显示,而不是产生#<ProcedureError:0x0000000ece02a8>
,这是人们期望的功能关系。使用debug
将其内容转储到屏幕上显示记录的所有属性,包括code
,但我仍然无法使用原始模板访问它!显然act.object.error
不是nil
,所以Rails告诉我act.object.error
是nil
对我没有任何意义。
沮丧,我试图通过使用act.object.error.to_json
解决该问题。这将打印出具有所有属性的记录的正确JSON。使用JSON.load()
就给了我一个正确的Hash
的所有属性,但使用[:code]
来试图访问代码给我undefined method '[]' for nil:NilClass
。同样,我知道该对象不是nil
,但Rails仍然拒绝让我访问它。
用尽想法,我试图用正则表达式将代码从原始JSON字符串中提取出来。 /"code":([0-9]+)/.match(act.object.error.to_json)
返回#<MatchData "\"code\":69" 1:"69">
,这是正确的。我用[1]
尝试访问匹配的代码号,但我又得到了undefined method '[]' for nil:NilClass
。
足够的ActiveRecord,我心想。我决定转向原始的SQL查询。我使用act.object.error_id
得到了有关错误的ID,然后将其打印到屏幕上以确保可以访问它。幸运的是,我可以。然后我将它插入我的SQL查询"... WHERE id = #{act.object.error_id}"
。我再次刷新页面,并遇到一个SQL错误。它显示了我生成的最终SQL查询字符串,但它以WHERE id =
结束。错误的ID没有被添加到字符串中。 ProcedureError.find(action.object.error_id)
给出了类似的错误。
我完全没有想法。什么可能阻止我以许多不同的方式访问一个简单的整数?
有一件事我可以看到马上蝙蝠是你违反了法律德米特这里
act.object.error.code
的表单对象显然有留下,但你可以通过一种方法在procedure_step
代理访问的子对象这可以帮助处理空值和其他错误情况。
尝试委托,因为我不确定由nested_forms_for创建的作用域是否允许ActiveRecord :: Relation对象正确执行。我会仔细检查本地。
代表团可能像下面
class ProcedureStepActions
belongs_to :error
def error_code
@error.code
end
end
编辑:
可能有帮助的其他事情是红宝石的版本和Rails使用的是和其他任何额外的宝石或库。
我在ProcedureStepAction中添加了一个方法,该方法会引发错误并返回其代码,但它具有与我最初获取的相同的零对象问题。我在Windows 10 x64上使用Rails 4.2.6,Ruby 2.2.3和nested_form_fields 0.7.6。 –
'k我在我的机器上(Rails 3.2,Ruby 2.2.0和Mac)声明了类似的问题,它看起来像其他类似的问题已经报告给该项目的所有者 - https://github.com/ncri/nested_form_fields/issues/55我假设这是要么在lib或Rails中的错误 – noname
我的猜测是前者。我认为这种意大利面条访问并不是真正推荐给AFAIK的复杂模型。您可能只想从ProcedureStepActions继承ProcedureErrors并为错误创建一个cusom工作流 – noname
这里至少有几个问题。首先,如果你使用4.x,你可能想要使用fields_for,而不是nested_fields_for
。
第二个与第一个答案指出的相似。你有一个嵌套的字段形式,它允许你嵌套一个层次,但你试图嵌套两个层次。通过解决违反规则的规则,你应该能够取得更多的进展。
调试这样的东西,你可以通过在你的erb中投入binding.pry或byebug来获得更多信息。
<%- binding.pry %>
然后重新加载页面。您的服务器将在您的代码中停止,您可以使用变量值来了解更多关于正在发生的事情。
所以,要明确你的ProcedureStepAction具有'belongs_to:error,class_name:'ProcedureError',foreign_key :: error_id'? – SteveTurczyn