设计确认,如何在点击时重新发送确认电子邮件?

AnA*_*ice 27 ruby-on-rails devise ruby-on-rails-3

我正在使用设计确认.我想给用户一个链接,点击并重新发送确认电子邮件.问题是,当用户点击链接时,它不会进入设计控制器.在routes.rb文件中是否有我遗漏的东西?这是我的设置:

的routes.rb

devise_for :users, :controllers => { :registrations => "registrations", :sessions => "sessions", :omniauth_callbacks => "authentications" }
Run Code Online (Sandbox Code Playgroud)

user.rb

devise :omniauthable, :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable, :validatable
Run Code Online (Sandbox Code Playgroud)

风景:

<a href="/users/confirmation/new" data-remote="true" data-method="post">Resend confirmation</a>
Run Code Online (Sandbox Code Playgroud)

谢谢

MZa*_*oza 28

向用户发送确认说明,然后找到用户 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
Run Code Online (Sandbox Code Playgroud)

  • 小心!这将每天提醒所有未经确认的用户(如果您每天都运行它),这可能会给您带来法律麻烦,因为他们中的一些人可能没有自己注册或可能想要一个人呆着。如果每天运行这个,把``where("created_at &gt; ?", Time.now - 72.hours).where("created_at &lt; ?", Time.now - 48.hours)`` (即只发送给用户昨天注册),否则你会发送垃圾邮件。您不想将其发送给今天注册的人,因为它会重新生成 Confirmation_token,从而使第一封电子邮件无效。 (2认同)

小智 8

resource_params
Run Code Online (Sandbox Code Playgroud)

是在设备控制器中定义的方法,例如,获取特定于控制器资源的设备资源(用户).DeviseController中的定义

def resource_params
params.fetch(resource_name, {})
end
Run Code Online (Sandbox Code Playgroud)

因此,为了将电子邮件作为参数传递,您需要将其包含在用户哈希中,因此在视图中而不是

link_to('resend', user_confirmation_path(email: "user@example.com"), :method => :post)                    
Run Code Online (Sandbox Code Playgroud)

将电子邮件插入哈希

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

这种方式设计将获取电子邮件参数


小智 7

我正在分享我的解决方案,因为它有点不同,但在我看来更接近正常的用户流程(重定向到感谢页面,您有一个按钮可以重新发送而无需再次编写电子邮件),并且您不必覆盖确认控制器。

注册后,用户被重定向到“谢谢”页面。在注册_控制器中:

  def after_inactive_sign_up_path_for(resource)
   session[:user_id] = resource.id
   redirect_to thanks_url
  end
Run Code Online (Sandbox Code Playgroud)

在用户控制器中,您只需对用户使用 .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
Run Code Online (Sandbox Code Playgroud)

路线:

get '/thanks', to: 'users#thanks'
post '/resend_confirmation', to: 'users#resend_confirmation', as: 'resend_confirmation'
Run Code Online (Sandbox Code Playgroud)

最后,在“谢谢”的观点中:

<%= button_to "Resend confirmation", resend_confirmation_path(:user_id => @user.id) %>
Run Code Online (Sandbox Code Playgroud)

这可以稍微清理一下,我敢肯定,因为我刚刚写了它,而且我还是 Rails 的新手,但是我在 Stack 上寻找这种解决方案却找不到,所以我想分享一下它。


Rod*_*res 6

正如您在https://github.com/plataformatec/devise/blob/master/app/controllers/devise/confirmations_controller.rb#L2上看到的,确认#new的HTTP方法是GET,而不是POST.尝试删除'data-method ="post"'并查看它是否有效.


Gab*_*rio 5

相当老的职位。但是,您可能只想将用户指向Devise的工作流程,而不是直接发送说明:

= link_to 'Resend confirmation', new_user_confirmation_path
Run Code Online (Sandbox Code Playgroud)

这将使用户进入Devise的视图,请求电子邮件发送确认指令。

希望它能对任何人有帮助。:)