根据输入值确认框

Confirm box depending on input value

我是 javascript 的新手,所以不要强行判断(任何建议或意见将不胜感激)。

我的 rails 应用程序(haml 文件)中有一个表单:

= simple_form_for(@book, remote: true) do |f|
  .row
  .form-group
    = f.input :book_title, as: :string, label: "Title of a book"
    %br
    = f.input :pages_number, as: :string, label: "Number of pages"
    %br
  .form-actions
    = f.button :submit, "Create", class: "btn btn-success"
    = link_to t('buttons.cancel'), '#', onclick: "$.modal.close()", class: 'btn btn-warning pull-right'

打开表单的控制器中的动作:

  def new
    @book = Book.new
  end

controller中保存表格的动作:

  def create
  end

我想做的是检查输入的页数是否大于 10。我想创建一个确认框。

我试图在 create 操作中保存 @pages_number = params[:pages_number],并在视图中使用 data: (@pages_number < 10 ? { confirm: "Are you sure?" } : nil),但没有成功。

在这种情况下我需要使用 Javascript 吗?

对于Rails表单,在定义输入数值字段时,我们可以设置该字段可接受的数值范围。

:min - 可接受的最小值。 :max - 最大可接受值。

以上属性可用于rails中的数值输入字段,控制取值范围

相当于

<input id="quantity" name="quantity" max="9" type="number" />

永远记住Ruby = ServerJavascript = Client


如果您根据 服务器 设置的条件进行评估,您的代码将有效。

但是,由于您是针对动态创建的条件进行评估,因此您需要使用 javascript 来确定该值是否值得调用确认对话框:

#app/assets/javascripts/application.js
$(document).on("ajax:beforeSend", "#form", function(event, xhr, settings) {
   var $el    = $(this);
   var $pages = $el.find("input[name='page_numbers']");
   if ($pages.val() > 10) {
      var response = confirm($el.data('confirm') || 'Are you sure?'); // not sure if this will pull the rails confirm
      if (!response) { return; }
   }
});

以上内容虽然需要调整,但应该评估输入到 page_numbers 框中的值。如果用户不确认,它将return,从而阻止进度。

当您使用 ajax 时,您可以使用 ajax:beforeSend 挂钩在请求发送到 ajax 驱动程序之前插入。如果您没有使用 remote: true,您需要查看绑定到 form.on("submit" 方法。


更新

经过长时间的聊天讨论,我们最终解决了以下问题:

#app/assets/javascripts/application.js
function validateForm() { 
var x = $('.value').val(); 
  if (x < 10) { 
    var res = confirm("Are you sure?"); 
    if (res == false) { return false; } 
  } 
}

#app/views/books/new.html.erb
<%= form_for @book, onclick: "return validateForm();", remote: true do |f| %>

我们还使用了this reference