在Rails中通过电子邮件激活用户

时间:2012-10-09 17:46:51

标签: ruby-on-rails-3

我还在学习Rails,我有一个简单的项目,用户通过提供他们的电子邮件和密码进行注册。我希望用户处于非活动状态,直到他点击电子邮件链接。我按照RailCasts的例子来重置密码,这就是我提出的:

我在用户模型中添加了两个新字段:

  • activation_token:字符串
  • 活性:布尔

User.rb内我有以下两种方法:

def send_activation
  generate_token(:activation_token)
  UserMailer.activation(self).deliver
end

def generate_token(column)
  begin
    self[column] = SecureRandom.urlsafe_base64
  end while User.exists?(column => self[column])
end

我创建了一个名为ActivationsController的新控制器,其中有一个方法:

  def update
    @user = User.find_by_activation_token(params[:id])

    @user.update_attribute(:active, true)
    flash[:success] = "Your account is now activated."
    redirect_to root_path
  end

routes.rb内我添加了这条路线:

resources :activations, only: [:update]

我使用以下方法创建了UserMailer

def activation(user)
  @user = user
  mail to: user.email, subject: "Account Activation"
end

rake routes说以下内容:

activation PUT  /activations/:id(.:format)  activations#update

activation.text.erb里面我有这个:

To activate your account, please click the link below:
<%= link_to activation_url(@user.activation_token), method: :put %>

现在,当我尝试注册用户时,我会在发送电子邮件之前收到此错误:

No route matches {:method=>:put}

任何想法?

麦克

2 个答案:

答案 0 :(得分:2)

你错过了链接文字:

<%= link_to 'TEXT', activation_url(@user.activation_token), method: :put %>

答案 1 :(得分:0)

我知道这很老了,但我也遇到了这个问题。我想回答它以帮助其他人。

我认为问题在于使用激活#update操作,您应该使用激活#edit操作,因为该操作使用GET请求而不是PATCH请求。由于用户在电子邮件中接收到这个(因此在Rails服务器之外),它应该是一个普通的旧GET link_to。

此外,至少在RAIL 4中(这个问题可能在此之前),您可以在初始变量之后使用哈希将params添加到您的url路径。所以......

<%= link_to "TEXT", edit_account_activation_url(@user.activation_token, email: @user.email)

(如果您想使用用户的电子邮件验证activation_token,那就是。)

我不确定你的其他代码是如何设置的,但是关于你对第一个答案的最后评论,这里有一些来自railstutorial.org/book的内容我发现有帮助...

  

因为我们使用帐户激活资源建模激活,所以   令牌本身可以显示为指定路径的参数

此外,本书(在脚注中)指出我们为什么要使用编辑操作而不是更新......

  

使用更新操作甚至可能更有意义,但激活链接需要通过电子邮件发送,因此应该包含常规浏览器点击,这会发出GET请求而不是更新操作所需的PATCH请求

来源:Rails Tutorial: Chapter 10