【问题标题】:Rendering 'belongs_to" in index view question - Ruby on Rails在索引视图问题中渲染“belongs_to” - Ruby on Rails
【发布时间】:2010-04-12 15:49:42
【问题描述】:

我使用 Ruby on Rails 创建了一个简单的博客应用程序。应用程序包括两个表,posts 和 cmets。评论belongs_to :post 和帖子has_many :comments

我创建了包含以下列的帖子表:title:stringbody:text。 我用以下列创建了 cmets 表:body:textpost_id:integername:stringemail:string

在 /views/cmets/index.html.erb 显示中,我还想显示带有帖子标题的所有 cmets 的列表。目前,索引视图只显示 post_id、body、name、email。

如何将 post_id 列替换为相应的帖子标题?这是我的代码:

CommentsController 索引操作:

  def index
    @comments = Comment.all :order => "created_at DESC"
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @comments }
      format.json { render :json => @comments }
      format.atom
    end
  end

/views/cmets/index.html.erb

<h1>Listing comments</h1>

<table>
  <tr>
    <th>Post</th>
    <th>Body</th>
  </tr>

<% @comments.each do |comment| %>
  <tr>
    <td><%=h comment.post_id %></td>
    <td><%=h comment.body %></td>
    <td><%=h comment.name %></td>
    <td><%=h comment.email %></td>
  </tr>
<% end %>
</table>

<br />

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    如果您有 100 个 cmets,在您的代码中使用 comments.post.title 将导致 101 个查询!请参阅此文档页面上的 Eager loading 部分。此处急切加载会将其减少到 2

    def index
      @comments = Comment.find(:all, :include => :post, :order => "created_at DESC")
      # ...
    end
    

    在您的观点中,您可以访问帖子标题

    <%= comment.post.title rescue "No post" %>
    

    编辑:我使用 rescue "No Post" 是因为您有一些带有 post_id = nil 的 cmets 和一些带有 post_id 的 cmets 指向不再存在的帖子。 p>

    【讨论】:

    • 我仍然收到一条错误消息:nil:NilClass 的未定义方法“标题”。有什么想法吗?
    • @bgadoci,尝试在终端中运行script/console。执行c = Comment.find(1),然后执行c.post.inspect。你看到了什么?
    • 好的,第一个命令返回这个:# 第二条命令返回“nil”。
    • 因为第一个评论可能是在我完成所有设置之前,我运行 c = Comment.find(25) 并返回:# 然后再次“nil”第二次请求。
    • c = Post.find(6) 返回:ActiveRecord: :RecordNotFound: 找不到 ID=6 的帖子。
    【解决方案2】:

    您可以简单地使用&lt;%=h comment.post.title %&gt; 来输出与评论关联的帖子的标题。

    【讨论】:

    • 这样做时出现以下错误:#<0x10420f990>
    • <0x1044dadc8>
    • <0x1044dadc8>
    【解决方案3】:

    试试@post.comment.title。既然post有很多评论属于post,那么就是一种父子关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      相关资源
      最近更新 更多