2

我希望用户在“激活”或使用电子邮件/密码登录之前单击激活链接。

我没有使用宝石,并希望保持这种状态。我的问题是用户注册后,无需点击激活码就可以登录。我有一条确认标记线和一条已确认的模型线。

用户控制器:

def create
  @user = User.new(params[:user])
 if @user.save
  render "root_path"
 else
  render "new"
 end
end

def confirmed
 user = User.find(:first, :conditions => {:confirmation_token => params[:confirmation_token]})
 if (!params[:confirmation_token].blank?) && user && !user.confirmed?
  user.confirmed!
  self.current_user = user
  flash[:notice] = "Thank you.  You account is now activated."
  redirect_to account_preference_path(current_user)
 else
  flash[:notice] = "Sorry we don't have your email in our database."
  redirect_to root_path
 end

结尾

用户模型:

def confirmed!
 self.confirmed = true
 self.confirmation_token = nil
 save(false) 
end

我错过了什么吗?谢谢!

我知道那里有 devise、auth-logic 等宝石,但我想学习如何从头开始编写它。谢谢。

编辑:

会话控制器

def create
 user = User.authenticate(params[:email], params[:password])
 if user && user.confirmed == true
  cookies.permanent.signed[:remember_token]
  redirect_to account_path(user.id), :notice => "Welcome, #{user.first_name}"
 else
  flash.now.alert = "Invalid email or password."
  render "new"
 end
end
4

2 回答 2

2

当然,经过多次磨难,我想通了。之前,我将路由重定向到一个新的控制器,他们可以在其中编辑密码,而不是仅仅将它们发送到只确认代码的路由。愚蠢的错误让我很头疼,但生活和学习。感谢所有研究它的人。

于 2011-09-27T21:45:53.117 回答
0

您可能想搜索一些教程来至少指导您完成整个过程,您将对正确编码导轨有更好的感觉。

基本上你的问题是你没有检查用户是否在登录时被确认。一种方法是将其添加到您的会话创建方法中。

if user && user.confirmed? 

最好的解决方案可能是使用这样的过滤器

 before_filter :authenticate, :only => [:new, :create, :edit, :destroy]

然后你有一个authenticate检查当前用户的方法,然后有逻辑表明 current_user 只能是一个确认用户。这将检查用户在他们需要的所有页面上是否有效,而不仅仅是在登录时。

于 2011-09-27T05:00:48.997 回答