Я использую подтверждаемое устройство. Я хочу дать пользователю ссылку, чтобы щелкнуть и повторно отправить электронное письмо с подтверждением. Проблема в том, что когда пользователь щелкает ссылку, она не переходит к контроллеру устройства. Есть ли что-то, чего мне не хватает в файле route.rb? Вот мои настройки:
route.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>
Спасибо
Довольно старый пост. Хотя вместо прямой отправки инструкций вы можете просто указать пользователю на рабочий процесс Devise:
= link_to 'Resend confirmation', new_user_confirmation_path
Это приведет пользователя к представлению Devise с просьбой отправить электронное письмо с инструкциями для подтверждения.
Надеюсь, это кому-нибудь поможет. :)
Вот мое решение. Надеюсь, что-то не пропало в моем переключателе в resource_params. Примечание: непроверенный
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 } %>
Вот мое решение, которое откроет форму разработки, где пользователь сможет ввести адрес электронной почты и запросить новое письмо с токеном подтверждения. Вся логика разработки, касающаяся проверки электронной почты, сохраняется:
app / controllers / translations_controller.rb. ] app / views / devise / translations / 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" %>
Я делюсь своим решением, так как оно немного другое, но, на мой взгляд, ближе к обычному потоку пользователей (перенаправьте на страницу с благодарностью, где у вас есть кнопка для повторной отправки без повторной отправки письма), и вы не будете придется переопределить контроллер подтверждений.
После регистрации пользователь перенаправляется на страницу «Спасибо». В 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'
наконец, в «спасибо» 'view:
<%= button_to "Resend confirmation", resend_confirmation_path(:user_id => @user.id) %>
Это может быть немного исправлено, я уверен, поскольку я только что написал это, и я все еще новичок в Rails, но я искал решения такого рода на стеке и не смог найти его, поэтому я решил поделиться им.