如何将帖子标记为已查看?

时间:2011-02-20 04:40:50

标签: ruby-on-rails ruby-on-rails-3

我有一个模型Post,其中有一个名为is_viewed的字段,在创建Post时为false。

向用户显示帖子时,将is_viewed设置为true的最佳方法是什么?

目前,我必须这样做:

class PostsController..

  def show
    #find the post
    @post = current_user.posts.find(params[:id])

    if !@post.is_viewed?
      #mark as viewed
      @post.update_attribute(:is_viewed, true)
      #find the post (again)
      @post = current_user.posts.find(params[:id])
    end
  end
end

为了只加载一次帖子,我可以这样做:

if !@post.viewed?
  if @post.update_attribute(:is_viewed, true)
    #simply update the viewed to true, "in memory" so that
    #the view's erb can use the correct value of the "is_viewed" variable
    @post.viewed = true
  end
end

但这是正确的做法吗?

1 个答案:

答案 0 :(得分:3)

你的红宝石不是很红宝石。通常,不会使用'is_'作为前缀,因为ruby允许方法名称以问号结尾。假设您的字段是布尔值,您可以使用@post.viewed?作为简写。

无论如何回答你的问题,因为ActiveRecord :: Dirty,真的没有必要检查当前的状态。如果您在@post.save为false的帖子上调用@post.changed?,则不会运行更新查询。所以:

@post = current_user.posts.find(params[:id])
@post.viewed = true
@post.save

你没有说为什么你的代码重新加载帖子所以我会认为这是假的。 Ruby有unless个关键字,因此您可以将if !expr等结构替换为unless expr

此外,ruby代码看起来最好缩进2个空格: - )