2017-08-26 164 views
0

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

这是在会话#resend_activation错误

的ActionController :: UrlGenerationError

没有路由匹配{:行动=> “编辑”,:控制器=> “account_activations”, :电子邮件=> “[email protected]”:ID =>零},可能无法比拟 约束:[: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

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

edit_account_activation_urlaccount_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