views:

80

answers:

3

HI guys, I am new to rails and just doing my first registration form. I have some validations that I want rails to check but for some reason it does not show the error messages.

On the views/user/signup.html.erb I have this

<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 %>

On the model I have the following

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

Controller

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

Edit: I updated my code for some reason now I cannot create a user. it will give me errors. Anyone knows how to get around this?

+5  A: 

Assuming you've named the User in question as @user in the controller change the form to

<% form_for :user, @user, :url => { :action => "signup" } do |f| %>

This might work as well

<% form_for @user, :url => { :action => "signup" } do |f| %>

Then in the form change accordingly:

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

So add f. and remove _tag on each one.

And the errormessage part to:

<%= f.error_messages :header => "Please complete all the fields", :message => "There is a problem with one or more fields" %>

Not sure about how the :header and :message work in this last one, but I hope you get the idea.

UPDATEd the form tags, because they had a bug.

pkauko
You can just do `<% form_for @user do |f| %>` nowadays and Rails will take care of the rest, assuming the resources have been set up conrrectly.
John Topley
how come my way of doing it does not work?
denniss
Don't know. I have never used the error_messages_for -tag, but the documentation suggests, that error_messages_for 'user' might work instead of error_messages_for :user (if you've named it @user), but this is a pure guess and an interpretation of documentation at api.rubyonrails.org.
pkauko
A: 

The problem could be that you are using redirect rather than render in your controller.

Error messages will not survive a redirect (a redirect causes your browser to immediately request a new page).

If you use render then the messages will not be lost.

Zachary
thank for pointing that out but i am using render.
denniss
A: 

Another issue may be the usage of rails 3 , which removed error_messages into a separate plugin.

David Lyod