2016-04-23 95 views
0

我在使用form_fornested_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.errornil對我沒有任何意義。

沮喪,我試圖通過使用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)給出了類似的錯誤。

我完全沒有想法。什麼可能阻止我以許多不同的方式訪問一個簡單的整數?

+0

所以,要明確你的ProcedureStepAction具有'belongs_to:error,class_name:'ProcedureError',foreign_key :: error_id'? – SteveTurczyn

回答

1

有一件事我可以看到馬上蝙蝠是你違反了法律德米特這裏

act.object.error.code 

的表單對象顯然有留下,但你可以通過一種方法在procedure_step代理訪問的子對象這可以幫助處理空值和其他錯誤情況。

嘗試委託,因爲我不確定由nested_forms_for創建的作用域是否允許ActiveRecord :: Relation對象正確執行。我會仔細檢查本地。

代表團可能像下面

class ProcedureStepActions 
    belongs_to :error 
    def error_code 
     @error.code 
    end 
end 

編輯:

可能有幫助的其他事情是紅寶石的版本和Rails使用的是和其他任何額外的寶石或庫。

+0

我在ProcedureStepAction中添加了一個方法,該方法會引發錯誤並返回其代碼,但它具有與我最初獲取的相同的零對象問題。我在Windows 10 x64上使用Rails 4.2.6,Ruby 2.2.3和nested_form_fields 0.7.6。 –

+1

'k我在我的機器上(Rails 3.2,Ruby 2.2.0和Mac)聲明瞭類似的問題,它看起來像其他類似的問題已經報告給該項目的所有者 - https://github.com/ncri/nested_form_fields/issues/55我假設這是要麼在lib或Rails中的錯誤 – noname

+1

我的猜測是前者。我認爲這種意大利麪條訪問並不是真正推薦給AFAIK的複雜模型。您可能只想從ProcedureStepActions繼承ProcedureErrors併爲錯誤創建一個cusom工作流 – noname

2

這裏至少有幾個問題。首先,如果你使用4.x,你可能想要使用fields_for,而不是nested_fields_for

第二個與第一個答案指出的相似。你有一個嵌套的字段形式,它允許你嵌套一個層次,但你試圖嵌套兩個層次。通過解決違反規則的規則,你應該能夠取得更多的進展。

調試這樣的東西,你可以通過在你的erb中投入binding.prybyebug來獲得更多信息。

<%- binding.pry %> 

然後重新加載頁面。您的服務器將在您的代碼中停止,您可以使用變量值來了解更多關於正在發生的事情。