包含渲染部分的模型关系

时间:2016-11-04 08:12:55

标签: ruby-on-rails ruby paperclip ruby-on-rails-5

奇怪的行为:

这适用于视图(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 %>
  

未定义的方法`收据&#39;为零:NilClass

B在局部内部,它呈现为:

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

猜猜我不需要确认任何关系,因为 A 工作正常。 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条评论,我需要在expense_modal视图中添加if语句:

<% 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) %>

1 个答案:

答案 0 :(得分:1)

它可能(和99%)只是因为

而发生
'main_default'

返回contract.expenses.find_by(contract_id: 1) ,因为没有与 特定 nil对象相关的expense对象。

你说,以下不起作用,这几乎是不可能的:)

contract