2016-11-04 107 views
-1

奇怪的行爲模型關係:包括與渲染部分

此作品在視圖中(A):

<%= Contract.first.expenses.find_by(contract_id: 1).receipt.url %> 
#=> Shows default image url 

這不確實的意見(B):

<%= contract.expenses.find_by(contract_id: 1).receipt.url %> 

未定義方法`收據'爲零:NilClass

B是內部的部分,它的呈現爲:

<% @contract.each do |contract| 
<%= render partial: 'expense_modal', locals: { contract: contract } %> 
<% end %> 

猜猜我不需要確認任何關係作爲一個作品就好了。 B有問題嗎?我使用Paperclip

Contract.first.expenses.find_by(contract_id: 1).inspect我得到什麼的預期,但不能如此,contract.expenses.find_by(contract_id: 1).receipt.inspect

編輯

我已經重新啓動服務器多少時間。以下是圖像:

enter image description here

enter image description here

enter image description here

的意見/費用/ _expense_model.html.erb:

<%= contract.expenses.find_by(contract_id: 1).receipt.url %> 

的意見/費用/ show.html .erb:

<% @contract.each do |contract| 
<%= render partial: 'expense_modal', locals: { contract: contract } %> 
<% end %> 

解決方案:

基於Andrey Deineko's意見,我需要if語句在expense_modal視圖中添加一個:

<% expense_obj = contract.expenses.find_by(contract_id: contract.id) %> 
<% if expense_obj %> 
    <% receipt_url = expense_obj.receipt.url %> 
<% else %> 
    <% receipt_url = "/assets/receipt/missing-receipt.jpg" %> 
<% end %> 

然後:

<%= image_tag(receipt_url) %> 
+0

你可以100%保證,那'合同== Contract.first'? –

+0

是的。 'contract.inspect' = true。 'contract.id.inspect = true' – Sylar

+0

不,請告訴我'Contract.first.id == contract.id' =>'true'(我敢打賭是'false' –

回答

1

它可能(和99%)是簡單的因爲事情發生使用

contract.expenses.find_by(contract_id: 1) 

回報nil,因爲不存在與本特定contract對象相關無此expense對象。

您說明,下列不工作,這幾乎是不可能的:)

contract = Contract.first 
contract.expenses.find_by(contract_id: 1).receipt.url # no way to not work 
+0

查看帖子編輯上面 – Sylar

+0

@Sylar你的編輯很好,並使總體感覺。比如'@ contract'包含一些對象,它沒有指定條件的相應的'費用'對象。 –

+0

@Sylar你正在執行'@ contract.each' - 只需檢查,例如'@contract.map {| contract | expenses.find_by(contract_id:1)} - 我敢打賭你會得到一個包含至少一個'nil'值的數組 –