繁体   English   中英

Rails:如何确认在文本框中输入的电子邮件地址与当前用户的电子邮件地址匹配?

[英]Rails: How to confirm email address entered in text box matches current user's email address?

我正在创建一个页面,该页面允许用户删除其帐户/配置文件。 在此页面上,我有一个文本框,用户在其中输入其电子邮件地址,以确认他们确实是当前用户,并且希望删除其帐户(单击按钮时)。

我想做的是,当用户单击文本框下方的“删除帐户”按钮时,我要获取该文本并将其与当前用户的电子邮件帐户进行比较。 如果匹配,我要删除该用户的帐户。 如果没有,我想刷新一条错误消息。

我已经弄清楚了一些逻辑,我将在下面粘贴我的内容。 现在,如果您单击“删除帐户”按钮,它将删除用户的帐户并重定向到主页,并在主页上闪烁“再见”消息。 但是,当前用户的电子邮件和文本框输入没有比较功能。 我不确定是否可以在Rails中做到这一点,或者是否必须合并JavaScript。 我正在使用Devise和Cancan。

请尽可能明确,我是Rails的新手。 谢谢!

电子邮件框和按钮位于/ settings / profile / delete,文件为'delete.html.haml'。

邮箱

.field
  = label :email, 'Email Address'
  = email_field :email, 'Enter your email address', id: 'delete-email-box'

删除帐户按钮(在电子邮件框下方)

#confirm-delete-btn
  = link_to 'Delete Account', user_registration_path, method: :delete, data: 
   { confirm: 'Are you sure you want to delete your account? This cannot be 
   undone!' }, class: submit btn-delete'
  = link_to 'Cancel', profile_index_path, id: 'cancel-profile'

profile_controller.rb

def delete
  @user = current_user
  @profile = current_user.profile
end

def destroy
  @user = current_user
  @profile = current_user.profile
  if @profile.destroy
    @user.destroy
    redirect_to root_url, notice: "User deleted."
  else
    render_error_message
  end
end

只是看着如何制作一个表格来删除项目并发现了这一点 因此,您的表单将如下所示:

<% form_for(:user, :url => path_for_your_destroy_action(@user), :html => {:method => :delete}) do  %>
  email: <%= text_field_tag :mail %>
  <%= submit_tag "Delete" %>
<% end %>

现在,在您的销毁方法中,您可以简单地检查电子邮件是否与当前用户的电子邮件匹配,并且如果这样做,则删除他的帐户:

def destroy
  if current_user.email == params[:email]
    current_user.destroy
    redirect_to your_path, notice: "user deleted"
  else
    render "your_form", notice: "invalid email"
  end
end

根据您的代码,添加到David的答案后,您似乎也在尝试删除用户的个人资料。 它没有明确描述用户与配置文件的关系,但是基于您如何在当前销毁操作中设置内容,我通过某种关联来假设用户。 在这种情况下,您仍然需要销毁概要文件,否则它将作为未使用的行保留在数据库中。 这可以通过对destroy动作进行简单的添加来实现:

def destroy
  if current_user.email == params[:email]
    current_user.profile.destroy
    current_user.destroy
    redirect_to your_path, notice: "user deleted"
  else
    render "your_form", notice: "invalid email"
  end
end

但是,这很笨拙,将来需要在其他地方实现类似功能时,很容易导致错误。 在模型层使用多种DRYer Rails处理方式:

User.rb:

has_one :profile, dependent: :destroy

这将确保在销毁用户时,其关联的配置文件也将自动销毁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM