2016-08-10 1 views
0

Ich werde die Funktion kurz erläutern, bevor ich mit der Erläuterung des Problems beginne. Wenn sich ein Benutzer anmeldet, erhält er ein Aktivierungs-Token in seiner E-Mail, das in 2 Stunden abläuft. Ich habe versucht, eine Funktion zu implementieren, mit der Benutzer das Aktivierungstoken in ihrer E-Mail erneut senden können.Ein Problem mit der URL beim Implementieren einer Funktion zum erneuten Senden von Token

Der Code für die Funktion zum erneuten Senden der Aktivierungstoken ist unten angegeben.

Controller-Code in Benutzer-Controller

def resend_verification_email 
    @user = User.find_by(email: params[:resend_verification_email] [:email].downcase) 
    if valid_email(params[:resend_verification_email] [:email]) 
     if [email protected] 
     redirect_to resend_verification_path 
     flash[:danger] = "Email does not exist" 
     elsif 
     [email protected]? 
     UserMailer.resend_activation(@user).deliver_now 
     flash[:success] = "Check your email for the activation token" 
     redirect_to resend_verification_path 
     else 
     redirect_to resend_verification_path 
     flash[:success] = "User is already activated."    
     end 
    else 
     flash[:danger] = "Email format is Invalid" 
     redirect_to resend_verification_path 
    end 
    end 

Konto Aktivierungen Controller

class AccountActivationsController < ApplicationController 

def edit 
    user = User.find_by(email: params[:email]) 
    if user && !user.activated? && user.authenticated?(:activation, params[:id]) #the token is actually available by params id 
    user.activate 
    log_in user 
    flash[:success] = "Account activated." 
    redirect_to home_path 
    else 
    flash[:danger] = "Invalid activation link" 
    redirect_to root_url 
    end 
end 


end 

Der Mailer Controller-Methode

def resend_activation(user) 
    @user = user 
    @userid = user.id 
    mail to: user.email, subject: "Account activation" 
    end 

Der Mailer Ansicht

<%= link_to "Activate your account", edit_account_activation_url(id: @user.activation_token, email: @user.email) %> 

Ich bekomme den folgenden Fehler. No route matches {:action=>"edit", :controller=>"account_activations", :email=>"[email protected]", :id=>nil} missing required keys: [:id].

Ich verstehe, was der Fehler sagt. Das erste Argument der URL ist das Token, und die Art und Weise zu greifen ist über params [: id], denn in REST-routen ist ID immer das erste Argument. Die E-Mail wird gut gesendet, wenn ich die URL los werde. Die URL wirft diesen Fehler auf und ich bin nicht wirklich sicher warum. Jede Hilfe wäre willkommen. Vielen Dank!

Ich habe nur die relevanten Routen aufgenommen.

get 'resend_verification' => 'users#resend_verification' 
    post 'resend_verification_email' => 'users#resend_verification_email' 

    resources :account_activations, only: [:edit] 
    resources :password_resets,  only: [:new, :create, :edit, :update] 

Relevante Rake Routen

edit_account_activation GET /account_activations/:id/edit(.:format)           account_activations#edit 

        users GET /users(.:format)                 users#index 
          POST /users(.:format)                 users#create 
       new_user GET /users/new(.:format)                users#new 
       edit_user GET /users/:id/edit(.:format)              users#edit 
        user GET /users/:id(.:format)                users#show 
          PATCH /users/:id(.:format)                users#update 
          PUT /users/:id(.:format)                users#update 
          DELETE /users/:id(.:format)                users#destroy 


resend_verification GET /resend_verification(.:format)             users#resend_verification 
resend_verification_email POST /resend_verification_email(.:format)            users#resend_verification_email 
+0

Ich habe eine Lösung. Bevor Sie das teilen, posten Sie bitte die Ausgabe von 'Rake Routes'. Ich muss mich vergewissern, ob ich recht habe. –

+0

@ArunKumar, ich habe die Rake-Routen in der ursprünglichen Frage ignoriert. –

+0

Bitte senden Sie die Ausgabe von 'Rake Routen'. Nicht die Routen, die Sie in routes.rb –

Antwort

1

Nun, ich würde nicht account_activations als einfalls Route definieren.

Der Kommentar: #the token is actually available by params id erklärt warum, imo id sollte stattdessen auf eine Modellressource verweisen.

Hier ist meine Abhilfe für das Problem:

  1. Route definieren als:

get "/account_activations/edit", to: "account_activations#edit", as: 'edit_account_activation'

  1. Definieren Sie den Link Aktivierung wie folgt:

<%= link_to "Activate your account", edit_account_activation_url(token: @user.activation_token, email: @user.email) %>

  1. Update-Controller:

class AccountActivationsController < ApplicationController def edit user = User.find_by(email: params[:email]) if user && !user.activated? && user.authenticated?(:activation, params[:token]) #... rest of code...

Alternativ, wenn Sie wirklich wollen, halten, wie es derzeit ist, dann versuchen Sie Link per E-Mail neu zu definieren, wie folgt:

<%= link_to "Activate your account", edit_account_activation_url(@user.activation_token, email: @user.email) %>

Dann kann sich params[:id] auf das Token beziehen, das Sie bereitstellen.

+0

'<% = link_to" Aktivieren Sie Ihr Konto ", edit_account_activation_url (@ user.activation_token, email: @ user.email)%>' so soll es sein. https://www.railstutorial.org/book/account_activation –

+0

aber ich denke sein Problem, und mein aktuelles Problem, ist das aus irgendeinem Grund @ user.activation_token = nil. –

2

Definieren Sie Ihre E-Mail-Link wie folgt:

<%= link_to "Activate your account", edit_account_activation_path(@user.activation_token, @user.email) %> 

Oder Sie können einfach den Primärschlüssel des Objekts auf dem Controller und Ex-Pass: @user.id und Methode Privat

before_action :set_user, only: [:edit] 

definieren innerhalb von verwenden Ihre Steuerung für Set Benutzer ab:

private 
    def set_user 
    @user = User.find_by_id(params[:id]) 
    redirect_to xyz_path if @user.blank? 
    end 
0

:activation_token wird virtuell erstellt als attr_accessor

Dies ist kein Routing-Problem.

@user.activation_token 

ist eigentlich Null zurück.

Sie müssen activation_token im Benutzermodell speichern, wenn Sie weitere Bestätigungs-E-Mails senden möchten.

Verwandte Themen