当我不使用表单模型时,在rails中实现AJAX表单验证的最佳地方是哪里?我该如何实现它呢?
我提交的表单需要在运行控制器中的方法之前检查IP地址是否存在并且是有效的。如果IP无效,我想通过flash[:danger]消息让用户知道。
views/tools/forms/_ping.html.erb
<%= form_tag ping_tool_path(1), role: "form", class: "form-inline form_ip", name: "ping-form", method: "post", remote: true do %>
<%= text_field_tag :ip, params[:ip], class: "form-control" %>
<%= submit_tag "Ping", name: nil, class: "btn btn-default" %>
<% end %>views/tools/ping.js.erb
$(".output").html("<%= j (@results) %>");controllers/tools_controller.rb
def ping
ping_host(params[:ip])
save_host(params[:ip])
# AJAX
respond_to do |format|
format.js
end
end发布于 2015-12-02 16:27:11
这将取决于应用程序的时间和可伸缩性。
对于更可伸缩的解决方案,我将使用active_interaction gem,创建一个新的交互,并在其上进行验证。
这是docs interaction
如果您想要一个更简单的解决方案,您可以始终在验证ip的控制器上创建一个私有方法。
编辑过的
private
require 'resolv'
def valid_ip?(ip)
case ip
when Resolv::IPv4::Regex
return true
when Resolv::IPv6::Regex
return true
else
return false
end
end受本文启发,http://spin.atomicobject.com/2013/08/28/ruby-ip-address-regex/
编辑2
连接两个部分
在你的控制器里
def ping
if valid_ip?(params[:ip])
ping_host(params[:ip])
save_host(params[:ip])
render json: { message: "sucess" }
else
render json: { errors: "Invalid Ip" }, status: 422
end
endjavascript
<script>
$(document).ready(function(){
$('.form_ip').on('ajax:success',function(e, data, status, xhr){
// success message
alert("success");
}).on('ajax:error',function(e, xhr, status, error){
// errors handler
var errors = $.parseJson(xhr.response_text).errors;
alert(errors);
});
});
</script>源-> http://travisjeffery.com/b/2012/04/rendering-errors-in-json-with-rails/
如果您也想在用户提交之前进行验证,请查看html5输入模式属性pattern.asp。
https://stackoverflow.com/questions/34047352
复制相似问题