Rails - 转到索引,但也可以通过相同的点击提交表单

Rails - go to index, but also submit form with the same click

我有一个重定向可以很好地让我进入我的索引。如下:

redirect_to action: :index, filters: { recent_price_change: "#{1.week.ago.strftime('%m/%d/%Y')} - #{Date.today.strftime('%m/%d/%Y')}" }, hide_filters: true

事实是,我在点击时填充过滤器。在同一页面上有一个标记有提交操作的按钮。

这里是 HAML 的摘录(它有点像 ERB...别担心,只要注意它是如何输入的:提交)包含它的文件:

  %button.btn.btn-primary.btn-sm{ type: 'submit', style: 'background-color: #a38672;' }
   %span.glyphicon.glyphicon-play
   Update List

点击上面的按钮提交表单,应用过滤器将一些结果显示在屏幕上的 table 中。

这个 was/is 一切都很好 - 但有一个新要求,我希望提交按钮在重定向时成为 "automatically clicked"。 AKA,我不想手动单击此按钮...相反,作为重定向的一部分,需要提交表单。所以当页面加载时,就好像我刚刚点击了按钮 -​​ 数据被填充等等。你们都知道如果这是 possible/how 我会这样做吗?我已经翻阅了 redirect_to 操作的文档,希望能在那里找到一些帮助 - 但到目前为止还没有骰子。

更新:

我补充了:

document.querySelector('.button.btn.btn-primary.btn-sm').click();

像这样放到文件末尾的 haml 中:

:javascript
   document.querySelector('.button.btn.btn-primary.btn-sm').click();

它确实在加载时提交了表单...但事实证明我的索引页面必须一遍又一遍地重新呈现...它反复单击按钮。它不会只做一次。想知道是否有某种方法可以将其绑定到 onload。

更新 2:

所以我写了

firstSubmit = function() {
  document.querySelector('.button.btn.btn-primary.btn-sm').click();
};
 $(document).on('page:load', firstSubmit);

问题是...似乎我的页面正在反复重新加载。然后,它一遍又一遍地向我的按钮发送垃圾邮件,导致页面的总流量。无论如何要限制它而不会变得非常笨拙(全局变量? - 我讨厌)?

您可以将标志变量添加到表单(假设表单操作重定向到 index):

= hidden_field_tag :do_not_redirect  
%button.btn.btn-primary.btn-sm{ type: 'submit', style: 'background-color: #a38672;' }
  %span.glyphicon.glyphicon-play
  Update List

然后修改javascript:

- unless params[:do_not_redirect]
  :javascript
    $(document).on('page:load', function () {
      $('#do_not_redirect').val(1);
      $('.button.btn.btn-primary.btn-sm').click();
    });

和控制器:

redirect_to action: :index, filters: {
  recent_price_change: "#{1.week.ago.strftime('%m/%d/%Y')} - #{Date.today.strftime('%m/%d/%Y')}"
}, hide_filters: true, do_not_redirect: params[:do_not_redirect].presence

我想你想做的是利用回调。不确定您是否熟悉,但回调只是您 运行 在其他一些操作发生后的例行程序。在这种情况下,在单击提交按钮(很可能是 after_save 或 after_commit 回调)后,您希望重定向到索引。在这种情况下,回调通常位于控制器的顶部,如下所示:

class SomeController < ApplicationController
    after_save :go_to_index

然后,在您的正常控制器操作之后:

    private
    def go_to_index
        // Redirect code
    end

我认为这就是您要查找的内容,您可以在此处找到回调 api 信息:http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html