jquery - Rails - 如何实现客户端的唯一性验证?

标签 jquery ruby-on-rails ajax validation

我有一个由许多 block 组成的建筑模型。当用户创建新 block 时,该 block 的名称不能与与该建筑物关联的任何其他 block 的名称匹配。我已经弄清楚如何在后端验证这一点,但我还想提供客户端验证以通知用户该名称已被另一个 block 使用。看起来这需要 AJAX 才能完成,但我无法弄清楚如何将 AJAX 链接到 Controller 方法。这是我到目前为止所拥有的:

Blocks/_form.html.erb

<%= form_for(@block, :remote => true, :html => { 'data-controller-name' => controller_name.singularize }) do |f| %>
  <%= f.hidden_field :building_id %>
  …
  <div class="field">
    <%= f.label :name, :class => "required" %>
    <%= f.text_field :name, :class => "required", :placeholder => "Untitled block" %>
  </div>

Blocks.js

$('#block_name').blur(function() {
  $.ajax({
    url: 'blocks/check_name',
    success: function(data, textStatus, jqXHR) {
        $('#block_name').removeClass('error')
    },
    error: function(data, textStatus, jqXHR) {
        $("#block_name").addClass('error')
    }
  });
});

路线.rb

"/blocks/check_name" => "blocks#check_name"

blocks_controller.rb

def check_name
  @building = Building.find(params[:block][:building_id])

  respond_to do |format|
    Format.json { render :json => @building.block_name_available(params[:block][:name]) }
  end
end

建筑.rb

def block_name_available(name)
  @block = Block.where(:building_id => self.id, :name => name)
  Return @block.nil?
end

如果有更好的方法来解决这个问题,我也愿意接受建议。

最佳答案

您可以使用 JavaScript 的一种策略是在表单上放置一个提交监听器,并调用 event.preventDefault() 来阻止表单提交。然后,您可以发出一个 ajax 请求来检查唯一性,并包含成功回调和错误回调:成功时,正常提交表单,但出错时,通知用户您希望 block 名称必须是唯一的。

关于jquery - Rails - 如何实现客户端的唯一性验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21293493/

相关文章:

javascript - 通过 onload() 和刷新按钮刷新网页

php - 实时 AJAX 搜索手机号码

javascript - 随机 net::ERR_CONNECTION_RESET 问题

javascript - jqGrid 标题宽度与数据列宽度不同

ruby-on-rails - rake 中止!您已经激活了 rake 10.0.2,但是您的 Gemfile 需要 rake 0.9.2.2

javascript - 可排序与可拖动 jQuery 和 Rails

ruby-on-rails - 带有 RSPEC 错误的 Controller 测试未实现

javascript - 如何在jquery中找到点击按钮的行号?

javascript - 是否可以在发送前更改表单数据?

javascript - jQuery 的嵌套 Accordion 菜单问题