Указать подтверждение, как отправить письмо с подтверждением по клику?
Я использую готовое подтверждение. Я хочу дать пользователю ссылку на клик и отправить письмо с подтверждением. Проблема в том, что, когда пользователь нажимает на ссылку, она не собирается в разрабатываемом контроллере. Есть ли что-то, что мне не хватает в файле 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>
Спасибо
Ответы
Ответ 1
Как вы могли видеть на https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L2, метод HTTP для подтверждения # new - GET, а не POST. Попробуйте удалить 'data-method = "post" и посмотреть, работает ли он.
Ответ 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"
Ответ 8
Возможно, вы захотите, чтобы это было запланировано на ночь, поэтому вам не нужно смотреть его.
Вот статья о том, как это сделать
http://www.cheynewallace.com/resend-devise-confirmation-emails-for-incomplete
Ответ 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 и не мог найти его, поэтому я думал поделиться им.