【发布时间】:2016-01-14 22:57:55
【问题描述】:
我有一个简单的用户注册表单。
当用户填写表单并单击“提交”时,我有一个 JavaScript 事件,它拦截提交并使用 AJAX 调用下面的validate 方法以在提交前检查表单数据。如果表单数据正常,则继续提交,但如果不是,则取消提交并在页面上显示警告。这是一种进行实时客户端验证的简单方法。
# app/controllers/users_controller.rb
# Validates the form data. Returns an error message response in the format
# { response: "Invalid email format!" }
#
# A blank response means success
#
def validate
if request.xhr? || <request came from another method in this controller>
# Run various validations on input data and determine a response
# response_text = ...
render json: { response: response_text }
else
redirect_to root_path
end
end
def create
if JSON.parse(validate)["response"].blank?
User.create(...)
# Other stuff
end
end
但是,当提交最终通过并通过时,它会向create 操作发送POST 以创建新的User。该方法调用validate再次(重新验证的成本很小)以确保没有人绕过表单并直接向服务器提交恶意请求。
所以我的validate 方法必须响应应用程序内的 (a) AJAX 调用和 (b) “内部”调用。对 validate 操作的所有其他调用都应该重定向到根路径。
我可以使用request.xhr? 非常简单地判断调用是否是 AJAX 调用。
如何检查操作是否是在内部调用的,而不是由用户调用的?
退一步说,这是一种很好的通用验证方法吗?有什么改进的想法吗?
谢谢!
【问题讨论】:
标签: ruby-on-rails ajax validation