本视频介绍 form validation ,表单验证。也就是在用户填写注册表单的时候如果填写的内容有问题,程序能够检查并且报错,避免直接把有问题的内容 直接存入数据库。

Rails 自带的 validator 接口

http://guides.rubyonrails.org/active_record_validations.html 上又各种接口的说明, 应该说最常用的情况都有现成的 validator 可以用。

关键的一步是到 user.rb 中添加

validates :name, :email, presence: true
validates :name, :email, uniqueness: { case_sensitive: false }

注意由于 password 部分的验证,has_secure_password 中已经定义过了,所以这里就不用写了。

进入 rails c 执行

u = User.new
u.save
u.errors.messages

这样就知道有哪些报错信息可以用来在 view 文件中使用了。

也有些方法在呼叫的时候是会跳过表单验证的,http://guides.rubyonrails.org/active_record_validations.html 的 1.3 部分有明确的列出。

controller 和 view 文件中相应的调整

users_controller.rb 中的 create 方法需要调整,要用实例变量,同时最后不能用 redirect_to 而要用 render

-    user = User.new(user_params)
-    user.save
-    cookies[:auth_token] = user.auth_token
-    redirect_to :root
+    @user = User.new(user_params)
+    if @user.save
+      cookies[:auth_token] = @user.auth_token
+      redirect_to :root
+    else
+      render :signup
+    end

这样就可以在 signup.html.erb 中适当显示报错信息了,每个 input 的下方都添加类似于下面的内容

<% if @user.errors[:name].any? %>
<dd class="error"><%= @user.errors[:name][0] %></dd>
<% end %>

其中 :name 字样会相应变成 :email:password:password_confirmation

common.css.scss 中 form 大括号里面添加

.error {
  margin: 5px 0 9px 0;
  color: #DB8A14;
}

这样就可以显示英文的报错信息了,如何显示中文,下一集介绍。

自定义 validator

参考 这里 的第6部分: Performing Custom Validations 。