【发布时间】:2016-11-04 08:12:54
【问题描述】:
奇怪的行为:
这适用于视图 (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 %>
nil:NilClass 的未定义方法 `receipt'
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 却不是这样
编辑
我已经多次重启服务器。以下是图片:
观看次数/费用/_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 cmets 我需要在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) %>
【问题讨论】:
-
你能100%保证
contract == Contract.first吗? -
是的。
contract.inspect= 真。contract.id.inspect = true -
不,请告诉我
Contract.first.id == contract.id=>true(我敢打赌是false -
Contract.first.id=1和contract.id相同。我需要显示屏幕截图吗? -
这是不可能的 - 看,你所做的应该等于
contract = Contract.first; contract.expenses.find_by(contract_id: 1).receipt.url- 如果你在控制台中运行它,它会工作。
标签: ruby-on-rails ruby paperclip ruby-on-rails-5