Ruby on rails Rails不显示验证错误消息

Ruby on rails Rails不显示验证错误消息,ruby-on-rails,validation,Ruby On Rails,Validation,大家好,我是rails的新手,刚刚做了我的第一份登记表。我想让rails检查一些验证,但由于某些原因,它没有显示错误消息 在views/user/signup.html.erb上,我有这个 <h1>Register Now!</h1> <% form_for :user, @u, :url => { :action => "signup" } do |f| %> <%= f.error_messages :header_message

大家好,我是rails的新手,刚刚做了我的第一份登记表。我想让rails检查一些验证,但由于某些原因,它没有显示错误消息

在views/user/signup.html.erb上,我有这个

<h1>Register Now!</h1>
<% form_for :user, @u, :url => { :action => "signup" } do |f| %>
    <%= f.error_messages :header_message => "Please Try Again!", :message => "We had some problems processing your registration" %>
    <%= f.label(:first, "First Name")%>
    <%= f.text_field(:first) %><br/>
    <%= f.label(:last, "Last Name")%>
    <%= f.text_field(:last) %><br/>
    <%= f.label(:username, "Username")%>
    <%= f.text_field(:username) %><br/>
    <%= f.label(:password, "Password")%>
    <%= f.password_field(:password) %><br/>
    <%= f.label(:password_confirmation, "Confirm Password")%>
    <%= f.password_field(:password_confirmation) %><br/>
    <%= f.label(:email, "E-mail")%>
    <%= f.text_field(:email) %> <br/>
    <%= f.label(:terms_of_service, "I agree to the terms of service") %>
    <%= f.check_box(:terms_of_service) %><br/>
    <%= f.submit("Sign Up")%>
<% end %>
立即注册!
{:action=>“注册”}do | f |%>
“请重试!”,:message=>“我们在处理您的注册时遇到一些问题”%>







在模型上,我有以下内容

class User < ActiveRecord::Base
  validates_length_of :username, :within =>4..15
  validates_length_of :password, :within => 3..520
  validates_presence_of :first, :last, :username, :email, :password, :password_confirmation
  validates_uniqueness_of :username, :email
  validates_confirmation_of :password
  validates_format_of :email, :with => /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i, :message => "Invalid email"   
  validates_acceptance_of :terms_of_service, :message => "You must agree to our Terms of Service in order to create account"  
end
class用户4..15的长度
验证密码的长度,在=>3..520内
验证是否存在:first、:last、:username、:email、:password、:password\u确认
验证:用户名,:电子邮件的唯一性
验证密码的确认
验证以下内容的格式::电子邮件,:with=>/^([^@\s]+)@((?:[-a-z0-9]+\)+[a-z]{2,})$/i,:消息=>“无效电子邮件”
验证是否接受:服务条款,:message=>“您必须同意我们的服务条款才能创建帐户”
结束
控制器

class UserController < ApplicationController
  def index
    @users = User.find(:all)
  end

  def signup
    if !params[:commit]
      render :action =>'signup'
    else
      @u = User.new
      @u.first = params[:first]
      @u.last = params[:last]
      @u.email = params[:email]
      @u.username = params[:username]
      @u.password = params[:password]
      @u.password_confirmation = params[:password_confirmation]
      @u.terms_of_service = params[:terms_of_service]
      if @u.valid?
        @u.password = Digest::SHA512.hexdigest(params[:password])
        @u.password_confirmation = Digest::SHA512.hexdigest(params[:password_confirmation])
        @u.save!
        render :action => 'success'
      else
        render :action => 'signup'
      end
    end
  end
end
class UserController'signup'
其他的
@u=用户。新
@u、 first=参数[:first]
@u、 last=参数[:last]
@u、 email=params[:email]
@u、 用户名=参数[:用户名]
@u、 password=params[:password]
@u、 密码确认=参数[:密码确认]
@u、 服务条款=参数[:服务条款]
如果@u.valid?
@u、 密码=摘要::SHA512.hexdigest(参数[:密码])
@u、 password\u confirmation=Digest::SHA512.hexdigest(参数[:password\u confirmation])
@u、 救命!
呈现:操作=>“成功”
其他的
呈现:操作=>“注册”
结束
结束
结束
结束
编辑:由于某些原因,我更新了代码,现在无法创建用户。它会给我错误。
有人知道如何解决这个问题吗?

假设您在控制器中将有问题的用户命名为@User,将表单更改为

<% form_for :user, @user, :url => { :action => "signup" } do |f| %>
{:action=>“注册”}do | f |%>
这也可能奏效

<% form_for @user, :url => { :action => "signup" } do |f| %>
{:action=>“注册”}do | f |%>
然后在形式上相应地改变:

<%= f.label(:first, "First Name")%>
<%= f.text_field :first %>

所以加上f。并移除每个上的_标签

将errormessage部分发送到:

<%= f.error_messages :header => "Please complete all the fields", :message => "There is a problem with one or more fields" %>
“请填写所有字段”,:message=>“一个或多个字段有问题”%>
我不确定:header和:message在最后一个中是如何工作的,但我希望您能理解


更新了表单标记,因为它们有一个bug。

假设您在控制器中将有问题的用户命名为@User,请将表单更改为

<% form_for :user, @user, :url => { :action => "signup" } do |f| %>
{:action=>“注册”}do | f |%>
这也可能奏效

<% form_for @user, :url => { :action => "signup" } do |f| %>
{:action=>“注册”}do | f |%>
然后在形式上相应地改变:

<%= f.label(:first, "First Name")%>
<%= f.text_field :first %>

所以加上f。并移除每个上的_标签

将errormessage部分发送到:

<%= f.error_messages :header => "Please complete all the fields", :message => "There is a problem with one or more fields" %>
“请填写所有字段”,:message=>“一个或多个字段有问题”%>
我不确定:header和:message在最后一个中是如何工作的,但我希望您能理解


更新了表单标记,因为它们有一个bug。

问题可能是您在控制器中使用的是
重定向
,而不是
渲染

错误消息将无法通过重定向(重定向会导致浏览器立即请求新页面)


如果使用render,则消息不会丢失。

问题可能是您在控制器中使用的是
重定向
,而不是
渲染

错误消息将无法通过重定向(重定向会导致浏览器立即请求新页面)


如果使用render,则消息不会丢失。

另一个问题可能是rails 3的使用,它将错误消息删除到单独的插件中。

另一个问题可能是rails 3的使用,它将错误消息删除到单独的插件中。

在控制器中,您试图保存的用户实例是否命名为“@User”?jdeseno是正确的,您应该发布控制器代码或只是在控制器中显示和注册操作,您试图保存的用户实例是否命名为“@User”?jdeseno是正确的,您应该发布控制器代码,或者只显示和注册操作。您现在只需执行
,Rails将负责其余操作,假设资源设置正确。不知道。我从来没有使用过error\u messages\u for-标记,但文档表明,“user”的error\u messages\u可能会代替:user的error\u messages\u(如果您将其命名为@user),但这只是对api.rubyonrails.org上文档的一种纯粹猜测和解释。现在您只需执行
,Rails将负责其余的工作,假设资源设置正确,我不知道。我从未使用过error_messages_for-标记,但文档表明,error_messages_for'user'可能会代替error_messages_for:user(如果您将其命名为@user),但这是对api.rubyonrails.org文档的纯粹猜测和解释。因为您的回答,我意识到在重定向时,闪光灯在重定向之后出现。当重新呈现编辑页面时,我需要先闪现,然后再呈现动作。因为你的回答,我意识到重定向时,闪现在重定向之后。当重新呈现编辑页面时,我需要先刷新,然后呈现动作。