【问题标题】:Rails - How do I implement client-side validation for uniqueness?Rails - 如何实现客户端唯一性验证?
【发布时间】:2014-01-22 20:40:12
【问题描述】:

我有一个由许多块组成的建筑模型。当用户创建新块时,块的名称不能与与该建筑物关联的任何其他块的名称匹配。我已经想出了如何在后端验证这一点,但我还想提供客户端验证以通知用户该名称已被另一个块使用。似乎这需要 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

建筑.rb

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

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

【问题讨论】:

    标签: jquery ruby-on-rails ajax validation


    【解决方案1】:

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

    【讨论】:

    • 听起来很有趣,但我仍然无法弄清楚如何将 ajax 请求链接到我的控制器。
    • 发送 ajax 请求的 URL 将取决于与您希望触发的相应控制器操作相对应的路由。
    • 所以,我只需要在 blocks.js 模糊函数中做:$.ajax({ url: "/blocks/check_name" }) 吗?控制器如何知道字段输入文本是什么?
    【解决方案2】:

    在 form_for 块中尝试:validate =&gt; true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多