Hello. I''m trying to create a form. It has only a username and a
password field.
The validation methods, such as validates_presence_of, aren''t working.
Does anyone know why?
------------------
class UsersController < ApplicationController
	def index
    	@users = User.all
	end
	def show
		@user = User.find(params[:id])
	end
	def new
		if session[:user_id].nil?
			if params[:user].nil? #User hasn''t filled the form
				@user = User.new
			else #User has filled the form
				user = User.new(params[:user])
				if user.save
					user.salt = rand(1000000000)
					user.password = Digest::MD5.hexdigest(user.salt.to_s +
user.password)
					user.save
					flash[:notice] = ''User was successfully created.''
					session[:user_id] = user.id
					session[:password] = user.password
					redirect_to
url_for(:action=>"index",:controller=>"users")
				else
					render :action => "new"
				end
			end
		else #User is already logged in
			flash[:notice] = ''You are already registered.''
			redirect_to url_for(:action=>"index")
		end
	 end
# Some non-related methods removed...
end
-----------
ActionController::Routing::Routes.draw do |map|
	map.connect ''login/'', :controller => "users",
:action => "login"
	map.connect ''logout/'', :controller => "users",
:action => "logout"
	map.connect ''register/'', :controller => "users",
:action => "new"
	map.resources :users # I want to remove this line in the future...
  map.connect '':controller/:action/:id'' # I want to remove
this line
in the future...
  map.connect '':controller/:action/:id.:format'' # I want to
remove
this line in the future...
end
-----------
<h1>New user</h1>
<% form_for :user, :url =>{:action=>"new",
:controller=>"users"} do |
f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :name %><br />
    <%= f.text_field :name %>
  </p>
  <p>
    <%= f.label :password %><br />
    <%= f.password_field :password %>
  </p>
  <p>
    <%= f.submit ''Create'' %>
  </p>
<% end %>
<%= link_to ''Back'', users_path %>
------------
class User < ActiveRecord::Base
	validates_presence_of :name, :password
end
According to the API, you will need to do seperate validations. This
is due to the fact that if there''s a comma after name, it expects an
option. :password is not an option.
So:
class User < ActiveRecord::Base
        validates_presence_of :name
        validates_presence_of :password
end
Hope this helps! If it doesn''t, please check back.
Kind regards,
Jaap Haagmans
w. http://www.relywebsolutions.nl
Gabriel Bianconi wrote:> Hello. I''m trying to create a form. It has only a username and a > password field. > > The validation methods, such as validates_presence_of, aren''t working. > Does anyone know why? >please submit why you don''t think they are working; You received an error message? You checked the db and the record is/ins''t there with invalid data? Your form didn''t submit? What??? -- Posted via http://www.ruby-forum.com/.
Now it doesn''t submit with blank password. But it doesn''t display the errors... Do you know why? On 11 ago, 16:55, jhaagmans <jaap.haagm...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> According to the API, you will need to do seperate validations. This > is due to the fact that if there''s a comma after name, it expects an > option. :password is not an option. > > So: > class User < ActiveRecord::Base > validates_presence_of :name > validates_presence_of :password > end > > Hope this helps! If it doesn''t, please check back. > > Kind regards, > Jaap Haagmans > w.http://www.relywebsolutions.nl
Ilan, Before, it didn''t worked because the form was submitted even with the password field blank. Now, the problem is that the errors don''t appear. On 11 ago, 16:57, Ilan Berci <rails-mailing-l...-ARtvInVfO7ksV2N9l4h3zg@public.gmane.org> wrote:> Gabriel Bianconi wrote: > > Hello. I''m trying to create a form. It has only a username and a > > password field. > > > The validation methods, such as validates_presence_of, aren''t working. > > Does anyone know why? > > please submit why you don''t think they are working; You received an > error message? You checked the db and the record is/ins''t there with > invalid data? Your form didn''t submit? What??? > -- > Posted viahttp://www.ruby-forum.com/.
Gabriel Bianconi wrote:> Ilan, > > Before, it didn''t worked because the form was submitted even with the > password field blank. > > Now, the problem is that the errors don''t appear.why do you have if user.save .... ..... user.save Are you trying to save multiple times? -- Posted via http://www.ruby-forum.com/.
He might be saving it twice because turning an empty string into MD5 will give an MD5 hash as well. I''m not sure whether that''s also the case in Rails, but it is in PHP. Doing an if with the empty password will give an error and not save it at all. Doing an if with a password string will save it and then re-save the altered string.> Now, the problem is that the errors don''t appear.Where is it that they don''t appear? In your log? Because that sounds strange to me. It should say something, even if it''s actually saving everything. It doesn''t give an error in your view because you don''t send any errors to your view: else render :action => "new" end It does send you back to the "new" view however. Does that happen? If you want it to show an error, you should actually send an error to the view.
Yes, it goes to the view, but the errors doesn''t appear in the view... How do I send them? On 12 ago, 05:43, jhaagmans <jaap.haagm...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> He might be saving it twice because turning an empty string into MD5 > will give an MD5 hash as well. I''m not sure whether that''s also the > case in Rails, but it is in PHP. Doing an if with the empty password > will give an error and not save it at all. Doing an if with a password > string will save it and then re-save the altered string. > > > Now, the problem is that the errors don''t appear. > > Where is it that they don''t appear? In your log? Because that sounds > strange to me. It should say something, even if it''s actually saving > everything. > > It doesn''t give an error in your view because you don''t send any > errors to your view: > > else > render :action => "new" > end > > It does send you back to the "new" view however. Does that happen? If > you want it to show an error, you should actually send an error to the > view.
You might want to try something like this:
else
  flash[:warning] = @user.errors.full_messages.join("<br />")
  render :action => "new"
end
and put <%= flash[:warning] %> somewhere in your view.
There''s also a way to get your model validations to show in the form,
but I don''t have an example of how to do such a thing. Of course,
@user.errors will also be sent to your view if you don''t specify the
flash like I did above, but I like this way more because you will be
able to re-use this solution or even include the flash somewhere in
your layout.
Hope this helps!
Kind regards,
Jaap Haagmans
w. http://www.relywebsolutions.nl
On 12 aug, 18:39, Gabriel Bianconi
<bianconi.gabr...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> Yes, it goes to the view, but the errors doesn''t appear in the
view...
> How do I send them?
>
> On 12 ago, 05:43, jhaagmans
<jaap.haagm...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > He might be saving it twice because turning an empty string into MD5
> > will give an MD5 hash as well. I''m not sure whether
that''s also the
> > case in Rails, but it is in PHP. Doing an if with the empty password
> > will give an error and not save it at all. Doing an if with a password
> > string will save it and then re-save the altered string.
>
> > > Now, the problem is that the errors don''t appear.
>
> > Where is it that they don''t appear? In your log? Because that
sounds
> > strange to me. It should say something, even if it''s actually
saving
> > everything.
>
> > It doesn''t give an error in your view because you
don''t send any
> > errors to your view:
>
> > else
> >   render :action => "new"
> > end
>
> > It does send you back to the "new" view however. Does that
happen? If
> > you want it to show an error, you should actually send an error to the
> > view.