我在使用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)
给出了类似的错误。
我完全没有想法。什么可能阻止我以许多不同的方式访问一个简单的整数?
所以,要明确你的ProcedureStepAction具有'belongs_to:error,class_name:'ProcedureError',foreign_key :: error_id'? – SteveTurczyn