Разработать подтверждающие, как отправить подтверждение по электронной почте по клику? - PullRequest
25 голосов
/ 09 марта 2012

Я пользуюсь устройством, подтверждающим. Я хочу дать пользователю ссылку, чтобы щелкнуть и отправить письмо-подтверждение. Проблема в том, что когда пользователь нажимает на ссылку, он не попадает в контроллер устройства. Что-то мне не хватает в файле rout.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>

Спасибо

Ответы [ 9 ]

28 голосов
/ 12 ноября 2014

для отправки инструкций подтверждения пользователю, которого вы нашли, а затем просто 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
7 голосов
/ 25 мая 2013
resource_params

- это метод, определенный в devise controller, который, например, получает ресурсы контроллера, специфичные для ресурса устройства (пользователя). определение в DeviseController

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

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

link_to('resend', user_confirmation_path(email: "user@example.com"), :method => :post)                    

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

link_to('resend', user_confirmation_path(user: {:email => "user@example.com"}), :method => :post)

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

6 голосов
/ 09 марта 2012

Как вы могли видеть на https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L2,, метод HTTP для подтверждения # new - это GET, а не POST. Попробуйте удалить 'data-method = "post" и посмотреть, работает ли он.

4 голосов
/ 25 марта 2015

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

= link_to 'Resend confirmation', new_user_confirmation_path

Это приведет пользователя к представлению Devise с просьбой отправить электронное письмо с инструкциями для подтверждения.

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

3 голосов
/ 13 апреля 2013

Вот мое решение. Надеюсь, что-то не пропало в моем переключателе в 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

* маршруты +1006 * devise_for :users, controllers: { confirmations: "confirmations" } вид

<%= link_to "resend confirmation", user_confirmation_path, data: { method: :post } %>
2 голосов
/ 06 апреля 2017

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

После регистрации пользователь перенаправляется на страницу «Спасибо». В регистрации_контроллер:

  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, но я искал такого рода решения в стеке и не мог найти его, поэтому я думал поделиться этим.

2 голосов
/ 28 января 2015

Чтобы повторно отправить электронное письмо с подтверждением, вы хотите, чтобы в методе публикации было указано «пользователи / подтверждение», а в конце нет «нового».

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

form_for(resource, url: user_confirmation_path) do |f|
  .form-inputs
    = f.input :email
  .form-actions
    = f.button :submit, "Resend"
2 голосов
/ 11 сентября 2013

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

app / controllers / authentications_controller.rb

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

config / rout.rb

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

app / views / devise / подтверждений / 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" %>
1 голос
/ 20 декабря 2013

Вы можете запланировать запуск на ночной основе, поэтому вам не нужно смотреть его.

Вот статья о том, как это сделать

http://www.cheynewallace.com/resend-devise-confirmation-emails-for-incomplete

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...