Rails 重新发送电子邮件激活

Rails resend email activation

我在设置重新发送激活电子邮件时遇到问题。当用户创建帐户时,电子邮件发送完美,但当他们尝试重新发送激活电子邮件时,我收到了错误。预先感谢所有帮助。

这是错误

ActionController::UrlGenerationError in Sessions#resend_activation

No route matches {:action=>"edit", :controller=>"account_activations", : email=>"TestEmail@gmail.com", :id=>nil}, possible unmatched constraints: [: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

edit_account_activation_url in account_activation.html.erb 需要用户 ID,因此您可能应该将其更改为:

<%= link_to edit_account_activation_url(@user.id) do %>

然后您可以在 account_activations_controller.rb 中检索用户 ID:

  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

我想通了,我忘了我必须在发送电子邮件之前调用 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