加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby on Rails / Devise:如果用户登录则在模

发布时间:2020-12-17 03:27:47 所属栏目:百科 来源:网络整理
导读:我最近提出了一个应用文章等的应用程序,其上有一个评论/审核系统.当用户发表评论时,会发生以下三种情况之一. 首先,如果他们是注册用户并通过Devise登录,他们的评论将被标记为状态“2”并立即发布.如果他们是具有先前批准的具有匹配电子邮件地址的评论的匿名
我最近提出了一个应用文章等的应用程序,其上有一个评论/审核系统.当用户发表评论时,会发生以下三种情况之一.

首先,如果他们是注册用户并通过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(或其他用户检测方法),那么除了定义控制器中的所有逻辑之外你别无选择,这也不是那么糟糕的做法吗?所以如果可能的话,我怎么能在模型中做这个逻辑呢?或者我应该只是让控制器变胖?

解决方法

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

我以前做过类似你的解决方案,这只是一个令人头痛的问题.

所以在你的创作中.

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

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

def current_user(current_user)
    current_user
end

然后你可以有一个before_create来检查是否为真.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读