Ruby on Rails / Devise:如果用户已登录,则在模型中确定

时间:2011-07-19 13:34:55

标签: ruby-on-rails ruby model devise

我最近提出了一个应用文章等的应用程序,其上有一个评论/审核系统。当用户发表评论时,会发生以下三种情况之一。

首先,如果他们是注册用户并通过Devise登录,他们的评论将被标记为状态“2”并立即发布。如果他们是具有先前批准的具有匹配电子邮件地址的评论的匿名用户,则评论获得状态“1”并被放入审核队列以供批准。如果用户完全是全新的并且他们的电子邮件不在系统中,则该评论的状态为“0”,并且会向其收件箱发送电子邮件以单击链接以批准其电子邮件。完成任何此操作后,将显示相应的通知/闪烁消息。

我已经完成了所有这些工作,但在控制器中几乎完成了所有逻辑和变量定义,使得创建动作非常胖。为了学习最佳实践和'胖模型,瘦子控制器'的惯例,我试图将我可以使用的逻辑移到评论模型中,特别是那些确定他们是否登录或者是什么的部分。所以假设,模型中有这样的东西......

attr_accessor :message
before_create :poster_type

def poster_type
  if current_user
    self.status = 2
    self.message = 'Your comment has been posted.'
  elsif Comment.find_by_mail(self.mail, :conditions => { :status => [1,2]}).present?
    self.status = 1
    self.message = 'Your comment has been sent for moderation.'
  else
    self.status = 0
    self.message = 'This is a new email, please confirm...'
  end
end

问题是,显然你不能在模型中使用Devise的current_user方法(或其他像user_signed_in?等)。我对此研究的每个答案都表示无益,访问current_user值等不是模型的业务。

但是,我并不需要给模型一个用户的信息(因为我已经看过所有其他线程试图做),所有我需要模型中的方法来弄清楚它们是否被记录是否。

另外,如果你不能在模型中使用current_user(或其他用户检测方法),那么除了定义控制器中的所有逻辑之外别无选择,并且也不是那么糟糕的做法?所以如果可能的话,我怎么能在模型中做这个逻辑呢?或者我应该只是让控制器变胖?

1 个答案:

答案 0 :(得分:7)

由于图层分离,您无法从任何模型访问设备用户或会话。您可以做的是将对象发送到模型。

之前我做过类似你的解决方案的事情,这只是一件令人头疼的问题。

所以在你的创作中。

def create
    if current_user
        @user.current_user(true)
    end
end

然后只需将true / false发送给用户的方法:

def current_user(current_user)
    current_user
end

然后你可以有before_create检查是否属实。