繁体   English   中英

如何识别rails form_tag中的Id属性?

[英]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”操作的请求(假设您使用resourcesconfig/routes.rb中生成与您的账户相关的路由)。 要发送带有“DELETE”操作的请求,在 Rails 中有几种方法:

  1. 使用:delete方法创建一个表单并通过表单提交触发它,就像您的第一个表单一样。
  2. 使用button_to:delete方法,它仍然使用带有提交按钮的表单,但是表单是由button_to生成的。
  3. 使用带有:delete方法的link_to ,它会创建一个锚点来使用 Rails UJS 执行“DELETE”请求,但它在 Rails 7 中已被弃用。

如果不希望表单发送“DELETE”请求,仍然可以使用 JS 发送。 (不使用$.getwindow.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.

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