我正在创建一个允许用户删除其帐户/个人资料的页面。在这个页面上,我有一个文本框,用户可以在其中键入他们的电子邮件地址,以确认他们确实是当前用户,并且他们想要删除他们的帐户(点击按钮时)。
我想要做的是,当用户点击"删除帐户"在文本框下方的按钮,我想获取该文本并将其与当前用户的电子邮件帐户进行比较。如果匹配,我想删除用户的帐户。如果没有,我想闪一条错误信息。
我已经找到了一些逻辑,我将粘贴下面的内容。 现在,如果您点击“删除帐户”'按钮,它删除用户的帐户并重定向到主页,并闪烁再见'主页上显示消息。 然而,没有比较功能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
答案 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
这将确保无论何时销毁用户,其关联的配置文件也会自动销毁。