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

时间:2014-06-20 16:19:07

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

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

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

我已经找到了一些逻辑,我将粘贴下面的内容。 现在,如果您点击“删除帐户”'按钮,它删除用户的帐户并重定向到主页,并闪烁再见'主页上显示消息。 然而,没有比较功能b / t当前用户的电子邮件和文本框条目。我不确定我是否可以这在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

2 个答案:

答案 0 :(得分:2)

刚看了如何制作表单来删除项目并找到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

答案 1 :(得分:1)

根据您的代码添加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

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