我在使用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