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.