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

时间:2017-08-31 15:13:08

标签: ruby-on-rails ruby haml erb

我有一个重定向,可以让我进入我的索引。它在下面:

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

单击上面的按钮提交表单,该表单应用过滤器将一些结果放在屏幕上的表格中。

这是/并且很好 - 但是有一个新的要求,我希望提交按钮是"自动点击"在重定向。 AKA,我不想手动点击此按钮...相反,作为重定向的一部分,需要提交表单。因此,当页面加载时,如果我刚刚单击按钮 - 数据已填充,等等。你们都知道这是否可行/我将如何做?我已经挖掘了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);

问题是......似乎我的页面反复重新加载。然后,它一遍又一遍地弹出我的按钮,导致页面的总流量。无论如何要限制这个而不是真正的janky(全局var? - 我讨厌)?

2 个答案:

答案 0 :(得分:2)

您可以将flag变量添加到表单中(假设表单操作重定向到... opt = tf.train.GradientDescentOptimizer(learn_rate) # get all trainable variables t_vars = tf.trainable_variables() # create a copy of all trainable variables with `0` as initial values accum_tvars = [tf.Variable(tf.zeros_like(tv.initialized_value()),trainable=False) for t_var in t_vars] # create a op to initialize all accums vars zero_ops = [tv.assign(tf.zeros_like(tv)) for tv in accum_tvars] # compute gradients for a batch batch_grads_vars = opt.compute_gradients(loss, t_vars) # collect the batch gradient into accumulated vars accum_ops = [accum_tvars[i].assign_add(batch_grad_var[0]) for i, batch_grad_var in enumerate(batch_grads_vars)] # apply accums gradients train_step = opt.apply_gradients([(accum_tvars[i], batch_grad_var[1]) for i, batch_grad_var in enumerate(batch_grads_vars)]) # train_step = opt.apply_gradients(zip(accum_tvars, zip(*batch_grads_vars)[1]) while True: # initialize the accumulated gards sess.run(zero_ops) # number of batches for gradient accumulation n_batches = 3 for i in xrange(n_batches): sess.run(accum_ops, feed_dict={X: x_init[:, i]}) sess.run(train_step) ):

index

然后修改javascript:

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

和控制器:

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

答案 1 :(得分:0)

我认为你想要做的就是利用回调。不确定您是否熟悉,但回调只是您在执行其他一些操作后运行的例程。在这种情况下,单击提交按钮(很可能是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