【问题标题】:Ruby on Rails view iterates through object even when object is nil即使对象为零,Ruby on Rails 视图也会遍历对象
【发布时间】:2018-02-27 16:52:56
【问题描述】:

在 ROR 和一般编程方面,我是初学者。我正在阅读文档中的基本入门指南,并且正在为博客创建 cmets 视图。在我看来,我有以下代码来呈现一篇文章上的所有 cmets -

<% @article.comments.each do |comment| %>
  <p>
    <strong>Commenter: </strong>
    <%= comment.commenter %>
  </p>
  <p>
    <strong>Comment: </strong>
    <%= comment.body %>
  </p>
<% end %>

我无法理解为什么即使没有与特定文章相关的评论,此代码也会呈现“评论者:”和“评论:”标题?!

我也尝试将上面的代码包装在 -

<% if @article.comments.all.empty? == false %>
  <!--Code Above-->
<% end %>

只是为了试验它。如果没有 cmets,这将阻止标题被呈现,但是当我添加一个评论时,除了刚刚添加的评论之外,标题会再次呈现。我只需要对此进行解释,以便更好地了解发生了什么。

【问题讨论】:

    标签: ruby ruby-on-rails-3 model-view-controller


    【解决方案1】:

    如果您没有在数据库中保存任何 cmets - 它可能是为表单初始化的空白新评论,很可能在评论列表之前呈现。尝试在控制器操作中加载现有的 cmets 以分离实例变量:

    @comments = @post.comments
    

    请记住在为表单初始化新注释之前执行此操作。我猜它是用@article.comments.build 在视图中初始化的,所以只需将它们加载到控制器操作中就足够了(顺便说一句,这是正确的地方)。迭代 @comments 以呈现列表:

    <% @comments.each do |comment| %>
    

    官方的“Rails 入门”指南将表格放在评论列表下方,可能是为了避免初学者遇到此类问题。我并不是说你做错了 - 顶部有表格是可以的,你只需要为此进行调整。

    请记住,您始终可以使用 new_record?persisted? 方法区分已保存和未保存的 ActiveRecord 对象。

    【讨论】:

    • 非常感谢您的反馈。这有助于我更好地理解 MVC 的工作原理。基本上,和你说的完全一样。因为所有 cmets 都在通过表单和 @article.comments.build 进行新的评论初始化后呈现,这导致了一个空的未保存的评论,评论者:和评论:字段填充。顺便说一句,再次根据入门指南,cmets 资源嵌套在我的文章资源中的路由中。这样做与为 cmets 创建单独的资源相比有什么优点/缺点吗?
    • 准确地说,您的评论不是nil,而是一个实际的Comment 对象。当您不确定正在播放的对象类型时,使用&lt;%= comment %&gt;&lt;%= comment.inspect %&gt; 检查会很有帮助。至于嵌套资源 - 我不经常使用它们,AFAIK 唯一的好处是在具有许多资源的大型应用程序中可见,它们使路由和 url 助手看起来更有条理。如果您想使用它们,请阅读guides.rubyonrails.org/routing.html#nested-resources。很高兴提供帮助 - 我希望我的回答是可以接受的。祝你好运:)
    • 您的回答非常有帮助,因为它们不仅是我特定问题的解决方案,而且是如何看待问题和理解问题的指南。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    相关资源
    最近更新 更多