【问题标题】:Connecting two models in rails在导轨中连接两个模型
【发布时间】:2018-10-23 10:30:48
【问题描述】:

我正在尝试从视图中的另一个模型调用值。

tse.headoffice.head_office_id

将 headoffice.rb 中的关系定义为

has_many :tse

在 tse.rb 中作为

belongs_to :headoffice

现在我收到一个未定义方法的错误

nil:NilClass 的未定义方法 `head_office_id'

【问题讨论】:

  • cross check tse head_office_id 是 nil 这就是你收到这个错误的原因,你应该用 tse.headoffice.present? 处理它
  • 在您的第一个陈述中,tse 是什么?它是 Tse 的一个实例吗?如果失败,请尝试@tse=Tse.first @tse.headoffice.head_office_id 缺少某些数据..
  • 不应该只是tse.headoffice_id吗?使用tse.headoffice,您已经访问了Headoffice 实例,在它上面调用head_office_id 没有任何意义。也许tse.headoffice.id
  • @Maxence 是 Tse 的一个实例。
  • @kiddorails 错误已清除,值不会从“总部”模型中获取。

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


【解决方案1】:
<% if tse.headoffice.present? %>
  <%= tse.headoffice.head_office_id %>
<% end %>

【讨论】:

  • 这个消除了错误,但没有从数据库中获取值。总公司表中有值。
【解决方案2】:

try() 让您可以调用对象上的方法,而不必担心该对象可能是nil 从而引发异常

<%= tse.try(:headoffice).try(:head_office_id) %>

【讨论】:

  • 您是否尝试过检查tse,只是为了确保您得到的结果?试试&lt;%= tse.inspect %&gt;
【解决方案3】:

假设 HeadOffice 模型有一个名为 head_office_id 的属性:

<%= tse.headoffice.head_office_id if tse.headoffice %>

如果不是这样:

<%= tse.headoffice_id %>

【讨论】:

  • @vivek-s 那么问题可能出在其他地方。可能模型没有通过控制器正确传递,或者您没有正确创建模型。你能发布控制器代码吗?展示存储在数据库中的真实模型及其属性的示例也会有所帮助
【解决方案4】:

这看起来不太对劲。通常has_many 引用是复数。您的命名方案可能与 Rails 固执己见的魔法发生了冲突。

还有为什么headoffice 会有一个名为headoffice_id 的字段?它不会只有一个名为id 的字段吗?最后,一个挑剔的,它应该被称为head_office而不是headofficetse 也不是个好名字。 tse 是什么?如果可以的话,拼写出来,并以单数或复数的方式形成。如果您遵循这些简单的命名准则,Rails 会更好地工作。

https://gist.github.com/iangreenleaf/b206d09c587e8fc6399e

请看下面的简单示例:

post.rb

has_many :comments

comment.rb

belongs_to :post

要访问帖子的 cmets,您需要输入以下内容:

Post.first.comment.body

或者,如果您不确定某个帖子是否有评论,您会说:

Post.first.try(:comment).try(:body)

【讨论】:

  • 是的。看起来问题出在命名约定上。只是在解决这个问题。
  • 一旦得出结论,请从此页面中选择一个答案或回答您自己的问题。这将帮助未来遇到与您相同或相似问题的苦苦挣扎的开发人员。也请随意对您认为有帮助的任何答案进行投票。 ?
  • 糟糕,抱歉。发生这种情况是因为在控制器中间使用了 Private 方法。坏我!
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 1970-01-01
  • 2013-12-17
相关资源
最近更新 更多