Подтвердить что ты не робот

Указать подтверждение, как отправить письмо с подтверждением по клику?

Я использую готовое подтверждение. Я хочу дать пользователю ссылку на клик и отправить письмо с подтверждением. Проблема в том, что, когда пользователь нажимает на ссылку, она не собирается в разрабатываемом контроллере. Есть ли что-то, что мне не хватает в файле routes.rb? Вот моя настройка:

routes.rb

devise_for :users, :controllers => { :registrations => "registrations", :sessions => "sessions", :omniauth_callbacks => "authentications" }

user.rb

devise :omniauthable, :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable, :validatable

Вид:

<a href="/users/confirmation/new" data-remote="true" data-method="post">Resend confirmation</a>

Спасибо

4b9b3361

Ответ 2

для отправки инструкций подтверждения пользователю, которого вы находите, а затем просто user.send_confirmation_instructions

namespace :user do
  task :resend_confirmation => :environment do
    users = User.where('confirmation_token IS NOT NULL')
    users.each do |user|
      user.send_confirmation_instructions
    end
  end
end

Ответ 3

resource_params

- это метод, определенный при разработке контроллера, который, например, получает ресурсы контроллера, например, ресурс устройства (Пользователь). определение в DeviseController

def resource_params
params.fetch(resource_name, {})
end

поэтому для того, чтобы передать электронное письмо в качестве параметра, вы должны включить его в хэш-код пользователя, поэтому в представлении вместо

link_to('resend', user_confirmation_path(email: "[email protected]"), :method => :post)                    

вставьте письмо в хэш

link_to('resend', user_confirmation_path(user: {:email => "[email protected]"}), :method => :post)

таким образом devise заберет параметр электронной почты

Ответ 4

Вот мое решение. Надеюсь, что в моем переключателе в resource_params не пропало что-то. Примечание: не ajaxified

контроллер подтверждения

class ConfirmationsController < Devise::ConfirmationsController

  # POST /resource/confirmation
  def create
    # self.resource = resource_class.send_confirmation_instructions(resource_params)
    self.resource = resource_class.send_confirmation_instructions({email: current_user.email})
    if successfully_sent?(resource)
      respond_with({}, :location => after_resending_confirmation_instructions_path_for(resource_name))
    else
      respond_with(resource)
    end
  end

protected

  # The path used after resending confirmation instructions.
  def after_resending_confirmation_instructions_path_for(resource_name)
    root_path
  end
end

маршруты

devise_for :users, controllers: { confirmations: "confirmations" } 

Вид

<%= link_to "resend confirmation", user_confirmation_path, data: { method: :post } %>

Ответ 5

Довольно старая почта. Хотя вместо прямой отправки инструкций вы можете просто указать пользователю рабочий процесс Devise:

= link_to 'Resend confirmation', new_user_confirmation_path

Это приведет к тому, что пользователь просмотрит представление, запрашивающее электронное письмо, чтобы отправить инструкции по подтверждению.

Надеюсь, что это поможет кому угодно.:)

Ответ 6

вот мое решение, которое откроет форму разработки, где пользователь может ввести адрес электронной почты и запросить новое письмо с токеном подтверждения. Вся разработанная логика проверки электронной почты сохраняется:

приложение/контроллеры/confirmations_controller.rb

class ConfirmationsController < Devise::ConfirmationsController
# GET /resource/confirmation/new
  def new
    self.resource = resource_class.new
  end
end

конфигурации/routes.rb

devise_for :users, controllers: { confirmations: "confirmations" }

приложение/просмотров/изобрести/подтверждения/new.html.erb

<h2>Resend confirmation instructions</h2>
<%= form_for(resource, :as => resource_name, :url => confirmation_path(resource_name), :html => { :method => :post }) do |f| %>
  <%= devise_error_messages! %>

  <div><%= f.label :email %><br />
  <%= f.email_field :email, :autofocus => true %></div>

  <div><%= f.submit "Resend confirmation instructions" %></div>
<% end %>

<%= render "devise/shared/links" %>

Ответ 7

Чтобы повторно отправить письмо с подтверждением, вы хотите, чтобы метод post только с "пользователями/подтверждением" - no 'new' в конце.

Здесь представлена ​​форма, которая запрашивает адрес электронной почты пользователя и отправляет запрос на повторную отправку подтверждения следующим образом:

form_for(resource, url: user_confirmation_path) do |f|
  .form-inputs
    = f.input :email
  .form-actions
    = f.button :submit, "Resend"

Ответ 9

Я разделяю свое решение, поскольку это немного другое, но ближе к нормальному потоку пользователей, на мой взгляд (перенаправление на страницу с благодарностью, где у вас есть кнопка для повторной отправки без написания электронной почты снова), и вы не будете должны переопределить контроллер подтверждения.

После регистрации пользователь перенаправляется на страницу "Спасибо". В registrations_controller:

  def after_inactive_sign_up_path_for(resource)
   session[:user_id] = resource.id
   redirect_to thanks_url
  end

в пользовательском контроллере, вы просто используете .send_confirmation_instructions для пользователя

def thanks
    @user = User.find_by(id: session[:user_id])
end

def resend_confirmation
    user = User.find_by(id: params[:user_id])
    user.send_confirmation_instructions 
end

маршруты:

get '/thanks', to: 'users#thanks'
post '/resend_confirmation', to: 'users#resend_confirmation', as: 'resend_confirmation'

наконец, в представлении "спасибо":

<%= button_to "Resend confirmation", resend_confirmation_path(:user_id => @user.id) %>

Это можно немного почистить, я уверен, поскольку я только что написал это, и я все еще новичок в Rails, но я искал такие решения на Stack и не мог найти его, поэтому я думал поделиться им.