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 - 调用模型的方法时在视图中获取对象的字段的主要内容,如果未能解决你的问题,请参考以下文章