ruby-on-rails - javascript 函数在 jquery-ajax Rails 验证错误中不起作用显示

标签 ruby-on-rails ruby-on-rails-3 jquery-ui jquery

我有一个全局的 Jquery UI Datepicker 函数,可以在所有页面中使用日历。 我创建了一个单独的 JavaScript 页面,如下所示:

var showDatePickers = function() {
  $('[data-field-type="date"]').datepicker({
    dateFormat: "yy-mm--dd",
    showOn: "both",
    buttonImageOnly: true,
    buttonImage: "/assets/blue-calendar-icon.png",
    buttonText: "Calendar"
  });
}

$(showDatePickers);

我只是在我的 View 中发布了我的日期选择器字段,

<div class="field">
  <%= f.label :Renewal_Date %>
  <%= f.text_field :Renewal_Date, readonly: 'readonly', data: {field_type: date}}
</div>

我将上述函数调用到一个单独的 javascript 文件中。

$(function() {
  if ($('html.asset_contracts').length == 1) {
    $(document.body).on('ajax:success', '.new_asset_contract, .edit_asset_contract',     showDatePickers);
  }
});

当页面加载、编辑和新操作时,它工作正常。但是当 Rails 验证错误显示 datepicker 功能不起作用时。它显示空白的text_field

仅供引用:这是一个 ajax 页面,新建、创建、更新和编辑 操作就像 ajax 页面一样工作。因此,我在表单中添加了 remote: true,并且我有 new.js、edit.js、create.js 和 update.js

这是我的 Controller ,

def create
     @contract = Asset::Contract.new(params[:asset_contract])

     respond_to do |format|
       if @contract.save
         format.html { redirect_to asset_contracts_path, notice: "Successfully Created" }
         format.js
         format.json { render json: @contract, status: :created, location: @contract }
       else
         format.html { render action: "new" }
         format.js
         format.json { render json: @contract.errors, status: :unprocessable_entity }
       end
     end
   end



   def update
     @contract = Asset::Contract.find(params[:id])

     respond_to do |format|
       if @contract.update_attributes(params[:asset_contract])
         format.html { redirect_to asset_contracts_path, notice: "Succesfully Updated" }
         format.js
         format.json { head :no_content }
       else
         format.html { render action: "edit" }
         format.js
         format.json { render json: @contract.errors, status: :unprocessable_entity }
       end             
     end
   end

谢谢

最佳答案

您正在像这样创建日期选择器:

$(document.body).on('ajax:success', '.new_asset_contract, .edit_asset_contract',     showDatePickers);

但是,只有 AJAX 调用成功时才会运行,因此您还需要一个错误处理程序。

看来您正在使用命名空间事件,但我没有看到 jQuery 文档中引用了该事件。您可能想要使用全局 ajax 事件(例如 ajaxComplete、ajaxError 等)。

您需要为 ajaxError 附加一个单独的处理程序来处理错误情况,或者仅使用 ajaxComplete 事件代替 ajax:success。除非您需要特定的错误处理,否则 ajaxComplete 是一种可行的方法,因为您只需要编写/维护一个处理程序。从 jQuery 1.8 开始,全局事件在 document 上触发。您需要将监听器附加到文档,而无需任何其他选择器:

$(document).on('ajaxComplete', showDatePickers);

您可以在 Ajax Events 上阅读有关 jQuery AJAX 事件的更多信息。页。

关于ruby-on-rails - javascript 函数在 jquery-ajax Rails 验证错误中不起作用显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17522199/

相关文章:

ruby-on-rails - simple_form 中的分组集合

ruby-on-rails - 可以跳过对 update_attributes 的验证吗?

performance - 缓慢的 s3 url 生成回形针

ruby-on-rails - 在 Rails 中使用 Ajax 更新 Div 而无需重新加载页面

jquery - 防止 jQuery UI 可调整大小的元素覆盖另一个元素?

javascript - 带有表单验证插件的 jQuery UI 对话框

ruby-on-rails - 如何在用户未登录时将用户重定向到登录页面

ruby-on-rails - 如何让 refinerycms 显示从 Amazon S3 与/system/images...上传的图像 url?

jquery - 通过类获取 jqueryui 背景按钮颜色

ruby-on-rails - Ruby on Rails n00b。 rake 分贝 :migrate fail