我有一个由许多块组成的建筑模型。当用户创建新块时,块的名称不能与该建筑物关联的任何其他块的名称匹配。我已经想出如何在后端验证这一点,但我还想提供客户端验证,以通知用户该名称已被另一个块使用。看起来这需要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
如果有更好的方法,我也愿意接受建议。
答案 0 :(得分:0)
您可以使用JavaScript的一种策略是在表单上放置提交侦听器,并调用event.preventDefault()
以阻止表单提交。然后,您可以创建一个检查唯一性的ajax请求,包括成功和错误回调:成功时,正常提交表单,但出错时,请通知用户,但是您希望块名称必须是唯一的。
答案 1 :(得分:0)
在form_for块中尝试:validate => true
。