我在设置重新发送激活电子邮件时遇到问题。当用户创建帐户时,电子邮件发送完美,但当他们尝试重新发送我收到的激活电子邮件时出错。提前感谢所有的帮助。
这是错误
Sessions中的ActionController :: UrlGenerationError#resend_activation
没有路线匹配{:action =>"编辑",:controller =>" account_activations", :email =>" TestEmail@gmail.com",:id => nil},可能无法比拟 约束:[:id]
这是其在account_activation.html.erb
中突出显示的行<%= link_to edit_account_activation_url(@user.activation_token, email: @user.email) do %>
的routes.rb
resources :account_activations, only: [:edit]
get '/resend_page', to: 'sessions#resend_account_activation_page'
post 'resend_activation', to: 'sessions#resend_activation'
resend_account_activation_page.html.erb
<div class="FormBody">
<h1 style="margin-bottom:30px">Account Activation</h1>
<p> If you need the activation email to be resent enter the email you signed up with and hit the resend button. </p>
<%= form_for(:sessions, url: resend_activation_path) do |f| %>
<div>
<%= f.text_field :email, class: "Input", placeholder: "Email"%>
</div>
<%= f.submit "Resend", class: "SignUpButton", data: {toggle: "tooltip"}, title: "Resend" %>
<% end %>
</div>
sessions_controller.rb
def resend_activation
if @user = User.find_by_email(params[:sessions][:email])
@user.send_activation_email
flash[:success] = "Activation email resent!"
redirect_to root_url
else
flash.now[:danger] = 'Email is not asociated with any account, please sign up first.'
redirect_to root_url
end
end
user.rb
def activate
update_columns(activated: true, activated_at: Time.zone.now)
end
def send_activation_email
UserMailer.account_activation(self).deliver_now
end
account_activations_controller.rb
def edit
user = User.find_by(email: params[:email])
if user && !user.activated? && user.authenticated?(:activation, params[:id])
user.activate
log_in user
flash[:success] = "Account activated!"
redirect_to root_url
else
flash[:danger] = "Invalid activation link"
redirect_to root_url
end
end
end
user_mailer.rb
def account_activation(user)
@user = user
mail to: user.email, subject: "Account Activation"
end
答案 0 :(得分:1)
我想通了,我忘记了在发送电子邮件之前我必须调用create_activation_digest,因此它会创建一个新令牌。谢谢你的帮助!
def create_activation_digest
self.activation_token = User.new_token
self.activation_digest = User.digest(activation_token)
update_columns(activation_digest: User.digest(activation_token))
end
答案 1 :(得分:0)
edit_account_activation_url
中的{p> account_activation.html.erb
需要用户ID,因此您应该更改它:
<%= link_to edit_account_activation_url(@user.id) do %>
然后,您可以使用ID:
检索account_activations_controller.rb
中的用户
def edit
user = User.find(params[:id])
if user && !user.activated? && user.authenticated?(:activation, params[:id])
user.activate
log_in user
flash[:success] = "Account activated!"
redirect_to root_url
else
flash[:danger] = "Invalid activation link"
redirect_to root_url
end
end