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

时间:2014-01-22 20:40:13

标签: jquery ruby-on-rails ajax validation

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

块/ _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')
    }
  });
});

的routes.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

Building.rb

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

如果有更好的方法,我也愿意接受建议。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

在form_for块中尝试:validate => true