【问题标题】:Include model relation with render partial包括与渲染部分的模型关系
【发布时间】: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 = 1contract.id 相同。我需要显示屏幕截图吗?
  • 这是不可能的 - 看,你所做的应该等于 contract = Contract.first; contract.expenses.find_by(contract_id: 1).receipt.url - 如果你在控制台中运行它,它会工作。

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


【解决方案1】:

它可能(而且 99% 确实如此)发生只是因为

contract.expenses.find_by(contract_id: 1)

返回nil,因为没有这样的expense 对象与this 特定 contract 对象相关。

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

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

【讨论】:

  • @Sylar 您的编辑很好,完全有意义。我想说的是,@contract 包含一些对象,这些对象没有针对指定条件的对应 expenses 对象..
  • @Sylar 你在做@contract.each - 只需检查一下,例如@contract.map { |contract| expenses.find_by(contract_id: 1) } - 我敢打赌你会得到一个包含至少一个nil 值的数组
  • 好的。这有效Contract.first.expenses.find_by(contract_id: 1).receipt.url 但这不起作用:Contract.first.expenses.find_by(contract_id: contract.id).receipt.url contract.id 有什么问题?单独拥有contract.id 我看到1
  • @Sylar 你检查了@contract 变量的内容吗?运行我在之前评论中的建议,你会看到。
  • @Sylar no probs :) 总是一步一步调试,在这种情况下这是你能做的最好的事情:)
猜你喜欢
  • 1970-01-01
  • 2012-03-03
  • 2010-12-06
  • 1970-01-01
  • 2011-05-23
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多