3

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

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

  • 激活令牌:字符串
  • 活动:布尔

在里面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}

有任何想法吗?

麦克风

4

2 回答 2

2

您缺少链接文本:

<%= link_to 'TEXT', activation_url(@user.activation_token), method: :put %>
于 2012-10-09T19:43:23.300 回答
0

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

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

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

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

(如果您想使用用户的电子邮件对 activation_token 进行身份验证。)

我不确定您的其余代码是如何设置的,但是关于您对第一个答案的最后评论,这是 railstutorial.org/book 中我发现有用的内容...

因为我们使用 Account Activations 资源对激活进行建模,所以令牌本身可以作为命名路由的参数出现

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

使用更新操作可能更有意义,但激活链接需要在电子邮件中发送,因此应该涉及常规浏览器点击,它发出 GET 请求而不是更新操作所需的 PATCH 请求。

来源:Rails 教程:第 10 章

于 2016-05-19T19:39:04.067 回答