【问题标题】:Rails: How to confirm email address entered in text box matches current user's email address?Rails:如何确认在文本框中输入的电子邮件地址与当前用户的电子邮件地址匹配?
【发布时间】:2023-04-03 20:16:01
【问题描述】:

我正在创建一个允许用户删除其帐户/个人资料的页面。在此页面上,我有一个文本框,用户在其中键入他们的电子邮件地址以确认他们确实是当前用户并且他们想要删除他们的帐户(单击按钮后)。

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

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

请尽可能明确,我对 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

【问题讨论】:

  • params 将从表单中传递,并且您似乎已经实现了current_user,因此只需将params 值与current_user 销毁前的值进行比较。虽然现在看起来你实际上并没有提交表单,而是使用超链接,所以我会先解决这个问题
  • @engineersmnky 您介意告诉我如何修复表单并实施您的解决方案吗?如果你愿意,你可以添加作为答案,这样我就可以给你信用。谢谢!

标签: javascript ruby-on-rails ruby devise cancan


【解决方案1】:

刚看了如何制作表格来删除项目,发现this。所以你的表格看起来像这样:

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

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

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

【讨论】:

  • 不错!我现在就试试这个,然后回复你。感谢您花时间回答我!
  • 仅供参考,仍在努力实施此解决方案。很快就会回复您。
  • 一切正常!我稍后会完整发布我的代码作为答案,以防有人想看到它。再次感谢您的帮助!
  • 想要的参数不会嵌套在user 中吗? (例如params[:user][:email])
  • 是的,我认为应该是。我只是添加它来显示逻辑:)
【解决方案2】:

添加到大卫的答案,根据您的代码,您似乎也在尝试删除用户的个人资料。它没有明确描述用户如何与个人资料相关联,但根据您在当前销毁操作中设置事物的方式,我假设它是通过某种关联。在这种情况下,您仍然需要销毁配置文件,否则它将作为未使用的行保留在您的数据库中。这可以通过对销毁操作的简单添加来完成:

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 的方法:

用户.rb:

has_one :profile, dependent: :destroy

这将确保无论何时销毁用户,其关联的个人资料也会自动销毁。

【讨论】:

  • 感谢您的意见!是的,我需要清理一些东西。已经内置了一个依赖项,因此它们都使用上面的代码被销毁。我会尽快发布完整的代码,以防其他人遇到这种情况。
猜你喜欢
  • 2016-03-20
  • 2023-03-14
  • 1970-01-01
  • 2014-04-06
  • 2012-10-15
  • 2010-12-04
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多