[英]How to recognize Id attribute in rails form_tag?
我在rails中使用表单来传递一个id。 该 id 将触发 javascript Sweet Alert 功能,该功能将弹出一个带有确认消息的模式。 当消息被确认“是”时,用户将删除他们的帐户,这意味着将被重定向到 rails 路线。 这就是应该发生的事情。 我无法让 id 在表单中触发并调出模式,但路由运行良好。 让我向您展示我尝试实现此目的的两种方法。
Ruby on Rails
<%= form_tag(registration_path(current_user), {method: :delete}) do %>
<%= hidden_field_tag('deleteBtn') %>
<button type="submit"><i class="fa fa-trash"></i>Delete Account</button>
<% end %>
使用甜蜜警报的 Javascript
$('#deleteBtn').on('click', function(e) {
e.preventDefault();
swal({
title: 'Decline Inquiry',
text: 'Are you sure you want to delete your account? This will delete all records of your entire account.',
icon: 'warning',
buttons: [ 'Yes', 'No']
}).then(isNo => {
if(isNo) return;
$('#deleteBtn').submit();
});
});
请理解我已经尝试了 form_tag 的几种变体,当我检查它时,html id 甚至不会出现:
<%= form_tag 'registration_path(current_user)', ({method: :delete, id: "deleteBtn"}) do %>
<button type="submit"><i class="fa fa-trash"></i>Delete Account</button>
<% end %>
现在需要注意的是,我可以删除表单并仅使用传递 id 的按钮和模式工作,但是在 Javascript 中访问 rails 路由失败并且我收到路由错误消息。 我刚换了
$('#deleteBtn').submit();
和
$.get('<%= link_to registration_path(current_user), method: :delete, class: 'delete' do %><% end %>');
或者
window.location.pathname('<%= link_to registration_path(current_user), method: :delete, class: 'delete' do %><% end %>');
我已经为此工作了一整天,感谢您提供任何帮助。 由于我无法在 Javascript 中访问 rails 路线,我唯一的选择是使用表单。
版本:Rails 4.2.4
您可能会误解link_to
的用法。 link_to
不仅会创建一个路径,还会创建一个锚 HTML 元素,就像 rails doc ( https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to ) 示例显示:
link_to "Remove Profile", profile_path(@profile), method: :delete
# => <a href="/profiles/1" rel="nofollow" data-method="delete">Remove Profile</a>
如果您想删除一个账户,您需要发送一个带有“DELETE”操作的请求(假设您使用resources
在config/routes.rb
中生成与您的账户相关的路由)。 要发送带有“DELETE”操作的请求,在 Rails 中有几种方法:
:delete
方法创建一个表单并通过表单提交触发它,就像您的第一个表单一样。button_to
和:delete
方法,它仍然使用带有提交按钮的表单,但是表单是由button_to
生成的。:delete
方法的link_to
,它会创建一个锚点来使用 Rails UJS 执行“DELETE”请求,但它在 Rails 7 中已被弃用。 如果不希望表单发送“DELETE”请求,仍然可以使用 JS 发送。 (不使用$.get
或window.location
,它们用于“GET”请求。)但这不是一项简单的工作,因为您需要处理 Rails 表单自动为您执行的 CSRF 保护。
在我看来,使用表单提交来发送“DELETE”请求仍然是在 Rails 中做的最好的方式,就像你以前做过的那样。 如果您不想在页面上显示表单,也许使用 css 隐藏它?
更新
如果您使用设计默认路由,删除帐户时不需要 id。 Devise只提供当前用户的账号删除功能,即只有登录用户自己才能删除自己的账号。
如果要删除其他用户,则需要创建自己的控制器来执行此操作。 您可以参考其他相关的 SO: https ://stackoverflow.com/a/42144398/232710
更新
给表单添加id
属性非常简单,只需在form_tag
中添加id
选项,如下所示:
<%= form_tag(registration_path, { method: :delete, id: "account_delete_form" }) do %>
<button type="submit"><i class="fa fa-trash"></i>Delete Account</button>
<% end %>
生成的表单 HTML 就像
<form id="account_delete_form" action="/users" accept-charset="UTF-8" method="post">
<input type="hidden" name="_method" value="delete" autocomplete="off">
<input type="hidden" name="authenticity_token" value="iItLCVuN9N59HolXe7OQ-erHcO-Iz78vI0ghqdliU55CjuI1uyemcMlwW-WxeS8iXqCT1-ezaNlTqHcUJ9ynSA" autocomplete="off">
<button type="submit">
<i class="fa fa-trash"></i> Deletet Account
</button>
</form>
然后就可以用JS触发表单提交了:
$("#account_delete_form").submit();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.