我还在学习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}
任何想法?
麦克
答案 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请求