包含与渲染部分的模型关系

Include model relation with render partial

奇怪的行为:

这在视图 (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 %>

undefined method `receipt' for nil: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

却没有

编辑

我重启服务器很多次了。以下是图片:

views/expenses/_expense_model.html.erb:

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

views/expenses/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) %>

它可能(99% 是)发生只是因为

contract.expenses.find_by(contract_id: 1)

returns nil, 因为没有这样的 expense 对象与 this particular contract对象。

您是在说以下内容不起作用,这几乎是不可能的:)

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