关键是要form_for
使用正确的对象。所以,而不是
<%= form_for(User.new, :url => '/pricing/sign_up') do |f| %>
您应该使用实例变量来包含对象,就像这样
<%= form_for(@user, :url => '/pricing/sign_up') do |f| %>
控制器操作如下所示:
# Note: this may need to be an `edit` method instead?
def new
@user = User.new
end
# Note: this may need to be an `update` method instead?
def create
@user = User.new(params[:user])
if @user.save
# Do something... Usually a redirect with success message.
else
render :new
end
end
这个 create 方法的作用是@user
用表单中的参数填充对象。然后调用@user.save
将在幕后调用@user.valid?
,如果没有返回错误,则将记录保存到数据库中。但这部分是关键。如果@user.valid?
确实导致错误,则将@user
填充错误集合。然后,在完成并重新呈现您的用户表单后,表单将能够通过访问集合render :new
来吐出错误消息。@user.errors
否则,就像您以前拥有它的方式一样,您总是User.new
在表单中拥有一个永远不会有任何错误的对象,因为它以前从未用于尝试记录验证。
如何在表单中显示错误是一个偏好问题,超出了这个问题的范围。这是一个指南: http: //guides.rubyonrails.org/active_record_validations.html#displaying-validation-errors-in-views