Rails - 调用模型的方法时在视图中获取对象的字段

Posted

技术标签:

【中文标题】Rails - 调用模型的方法时在视图中获取对象的字段【英文标题】:Rails - getting object's fields inside view when calling model's method 【发布时间】:2012-11-10 17:24:11 【问题描述】:

我是 ruby​​ 和 rails 的新手,但我不知道为什么这不起作用。

我正在做一个包含帖子及其 cmets 的简单博客,一切正常,但我尝试在 Post 模型中使用我自己的方法来获取该帖子中的最新评论。

class Post < ActiveRecord::Base
  attr_accessible :content, :title

  has_many :comments

    def latestComment(id)
        post = Post.find(id)
        comment = post.comments.last
    end
  end

和 index.html.erb

<h1>Hello World!</h1>

<h2>Posts</h2>

<% @posts.each do |post| %>

    <h3><%= link_to post.title, post %></h3>
    <p><%= post.content %></p>

    <%= latestComment = post.latestComment(post) %>

<% end %>

<h3>Add new post</h3>
<%= link_to "Add new post", new_post_path %>

这可行,它返回一些十六进制值,因此对象存在,但是我现在想从该对象中获取字段,如下所示

<p><%= latestComment.author %></p>
<p><%= latestComment.content %></p>

失败,错误是

undefined method `author' for nil:NilClass

这很奇怪,我不明白为什么我不能访问 cmets 字段..

///comment.rb

class Comment < ActiveRecord::Base
    attr_accessible :author, :content, :post_id

    belongs_to :post
end

【问题讨论】:

试试这个

【参考方案1】:

由于您正在循环多个帖子,因此其中一个帖子可能没有任何 cmets,这使得 post.comments.last 返回 nil。您可以通过在尝试呈现评论之前对其进行检查来解决此问题:

class Post < ActiveRecord::Base
  def has_comments?
    comments.count > 0
  end

  def last_comment
    comments.last
  end
end

然后,在视图上:

<% @posts.each do |post| %>

  <h3><%= link_to post.title, post %></h3>
  <p><%= post.content %></p>

  <% if post.has_comments? %>
    <p><%= post.last_comment.author %></p>
    <p><%= post.last_comment.content %></p>
  <% end %>
<% end %>

【讨论】:

是的,你说得对,来自 java,这有点令人困惑,它不会抛出某种空指针异常,所以我可以马上弄清楚,但是是的,假设我必须习惯它:D 谢谢!

以上是关于Rails - 调用模型的方法时在视图中获取对象的字段的主要内容,如果未能解决你的问题,请参考以下文章

Rails -> 部分视图的操作方法

JVM系列:JVM内存模型

测试时在模型上设置属性

使用模型绑定器时在 ASP.NET MVC 中往返视图数据

Ruby on Rails 中一个共享视图的两个控制器

Rails - 从模型中获取值到应用程序布局中