On Sat, Feb 20, 2010 at 6:56 PM, Conrad Taylor <[email protected]> wrote:
> On Sat, Feb 20, 2010 at 5:19 PM, Daniel Guettler < > [email protected]> wrote: > >> Ok but I'm not using an ActiveRecord instance here. I just temporarily >> made Session inherit from ActiveRecord::Base for testing purpose. And >> the attr_accessors didn't override anything since the table I created >> only contained an id attribute. >> > > Session class inherits from ActiveRecord::Base. Thus, if you create an > instance(s) of > Session, then each instance is a type of ActiveRecord::Base. > > >> The idea here was to just create a normal class (not inheriting from >> ActiveRecord) and to only use the validations module. The session is >> not going to be stored in the database. >> >> > Then you can simply do the following: > > *require 'active_model' > > class Session > include ActiveModel::Validations > > validates_presence_of :login > validates_presence_of :password > > attr_accessor :login, :password > > def initialize( attributes = {}) > @attributes = attributes > end > > end > > puts "valid session" > puts > > session = Session.new( :login => "foo", :password => "bar" ) > puts session.valid? # => false > puts session.password = "foobar" > puts session.valid? # => true > puts session.errors > > puts > > puts "invalid session" > puts > session2 = Session.new( :login => "", :password => "bar" ) > puts session2.valid? # => false > puts session2.password = "foobar" > puts session2.valid? # => true > puts session2* > > * > * > Good luck, > > -Conrad > Here's a better version: require 'active_model' class Session include ActiveModel::Validations validates_presence_of :login validates_presence_of :password attr_accessor :login, :password def initialize( attributes = {}) @attributes = attributes end end puts "valid session" puts session = Session.new puts session.login = 'foo' puts session.password = 'bar' puts session.valid? # => true puts session.errors puts puts "invalid session" puts session2 = Session.new puts session2.password = "bar" puts session2.valid? # => true puts session2.errors I wish that this helps. Good luck, -Conrad > > >> The original implementation of Session was: >> >> class Session >> include ActiveModel::Validations >> attr_accessor :login, :password, :id >> end >> >> >> On Feb 20, 7:53 pm, Conrad Taylor <[email protected]> wrote: >> > On Sat, Feb 20, 2010 at 4:49 PM, Conrad Taylor <[email protected]> >> wrote: >> > > On Sat, Feb 20, 2010 at 4:38 PM, Daniel Guettler < >> > > [email protected]> wrote: >> > >> > >> Yes, this is correct and expected, the question to me is rather if it >> > >> is expected behavior to assume an update operation if the object >> > >> doesn't respond to :new_record? >> > >> > > Yes, this is expected because AR instance is either new (i.e. hasn't >> been >> > > saved) or >> > > not new (i.e. has been saved). One can easily test this in the Rails >> > > console. >> > >> > > -Conrad >> > >> > irb(main):026:0> post = Post.new >> > => #<Post id: nil, title: nil, body: nil, created_at: nil, updated_at: >> nil> >> > irb(main):027:0> post.new_record? >> > => true >> > irb(main):028:0> post.save >> > => true >> > irb(main):029:0> post.new_record? >> > => false >> > >> > -Conrad >> > >> > >> > >> > > On Feb 20, 7:34 pm, Conrad Taylor <[email protected]> wrote: >> > >> > On Sat, Feb 20, 2010 at 4:32 PM, Daniel Guettler >> > >> > <[email protected]>wrote: >> > >> > >> > > So to solve this, the reason why this ends up using :method => >> :put is >> > >> > > the following code in "apply_form_for_options!": >> > >> > >> > > html_options = >> > >> > > if object.respond_to?(:new_record?) && >> object.new_record? >> > >> > > { :class => dom_class(object, :new), :id => >> > >> > > dom_id(object), :method => :post } >> > >> > > else >> > >> > > { :class => dom_class(object, :edit), :id => >> > >> > > dom_id(object, :edit), :method => :put } >> > >> > > end >> > >> > >> > Yes, this is basic Rails. PUT HTTP verb translates to an update >> action. >> > >> > >> > -Conrad >> > >> > >> > > which means for every object not responding to new_record? it >> will >> > >> > > automatically set the method to PUT >> > >> > > since the options are reverse merged later with the provided >> options >> > >> > > this can be avoided by setting explicit :html => { :method => >> :post } >> > >> > > in form_for - not sure though if this is entended behavior... >> > >> > >> > > If someone has some inside view comments would be appreciated... >> > >> > >> > > On Feb 20, 7:24 pm, Daniel Guettler <[email protected]> >> > >> wrote: >> > >> > > > Ok what is really happening here is that for_for(Session.new, >> :url >> > >> => >> > >> > > > login_path) includes a hidden input field setting _method to >> put >> > >> which >> > >> > > > correctly complains about a routing error since no route is >> defined >> > >> > > > for PUT /login >> > >> > > > Remaining question to me is why does form_for set the method to >> PUT >> > >> > >> > > > Session.new.new_record? => NoMethodError >> > >> > > > Session.new.id => nil >> > >> > >> > > > On Feb 20, 7:17 pm, Daniel Guettler <[email protected] >> > >> > >> wrote: >> > >> > >> > > > > ah the last bit of the previous message should have not been >> in >> > >> there, >> > >> > > > > but should have been in this message. >> > >> > >> > > > > Changing the Session class to: >> > >> > >> > > > > class Session < ActiveRecord::Base >> > >> > > > > end >> > >> > >> > > > > and adding a table to the database (which is not the goal >> here >> > >> just a >> > >> > > > > workaround for figuring out what's going on here) makes the >> > >> everything >> > >> > > > > work correctly with: >> > >> > >> > > > > form_for(Session.new, :url => login_path) >> > >> > >> > > > > This clearly shouldn't be related but this is what I have so >> > >> far... >> > >> > >> > > > > On Feb 20, 7:11 pm, Daniel Guettler < >> [email protected]> >> > >> wrote: >> > >> > >> > > > > > not quite the routes you are providing are not equivalent >> to >> > >> what I >> > >> > > > > > wanted to archive and they are the only routes in the >> routing >> > >> file >> > >> > > for >> > >> > > > > > this test. What I want is: >> > >> > >> > > > > > GET /login should be resolved to session#new >> > >> > > > > > POST /login should be resolved to session#create >> > >> > >> > > > > > possible ways of doing so are according to the >> action_dispatch/ >> > >> > > > > > routing.rb file >> > >> > >> > > > > > get 'login' => 'session#new' >> > >> > > > > > post 'login' => 'session#create', :as => :login >> > >> > >> > > > > > or when using match >> > >> > >> > > > > > match 'login' => 'session#new', :via => :get >> > >> > > > > > match 'login' => 'session#create', :via => :post >> > >> > >> > > > > > the above two examples are equivalent since get and post >> just >> > >> add >> > >> > > > > > the :via => :method to the options and call match >> > >> > >> > > > > > class Session < ActiveRecord::Base >> > >> > > > > > # include ActiveModel::Validations >> > >> > >> > > > > > attr_accessor :login, :password #, :id >> > >> > >> > > > > > end >> > >> > >> > > > > > On Feb 20, 7:02 pm, Conrad Taylor <[email protected]> >> wrote: >> > >> > >> > > > > > > On Sat, Feb 20, 2010 at 4:00 PM, Conrad Taylor < >> > >> [email protected]> >> > >> > > wrote: >> > >> > > > > > > > On Sat, Feb 20, 2010 at 3:02 PM, Daniel Guettler < >> > >> > > > > > > > [email protected]> wrote: >> > >> > >> > > > > > > >> Hi, I just ran into this >> ActionController::RoutingError and >> > >> just >> > >> > > > > > > >> wanted to check if someone can confirm this as a bug >> in the >> > >> > > Rails 3 >> > >> > > > > > > >> beta gem. >> > >> > >> > > > > > > >> config/routes.rb contains: >> > >> > >> > > > > > > >> get 'login' => 'session#new' >> > >> > > > > > > >> post 'login' => 'session#create', :as => :login >> > >> > >> > > > > > > > Daniel, can you post the complete route? The 'get' and >> > >> 'post' >> > >> > > HTTP verbs >> > >> > > > > > > > should exist within a member or collection block of a >> > >> resource >> > >> > > block. For >> > >> > > > > > > > example, >> > >> > >> > > > > > > > resources :posts do >> > >> > > > > > > > collection do >> > >> > > > > > > > get :search >> > >> > > > > > > > end >> > >> > > > > > > > end >> > >> > >> > > > > > > > or >> > >> > >> > > > > > > > resources :posts do >> > >> > > > > > > > get :search, :on => :collection >> > >> > > > > > > > end >> > >> > >> > > > > > > > Note: both of the examples are equivalent. >> > >> > >> > > > > > > > Next, your routes look ambiguous meaning that you could >> have >> > >> > > easily >> > >> > > > > > > > implemented this as follows: >> > >> > >> > > > > > > > match 'login' => "user_sessions#lnew", :as => >> :login >> > >> > >> > > > > > > Correction: match 'login' => "user_sessions#new", >> :as => >> > >> > > :login >> > >> > >> > > > > > > > match 'login' => "user_sessions#destroy", :as => >> :logout >> > >> > >> > > > > > > > Lastly, your URLs will look like the following: >> > >> > >> > > > > > > >http://localhost:3000/logout >> > >> > > > > > > >http://localhost:3000/login >> > >> > >> > > > > > > > Good luck, >> > >> > >> > > > > > > > -Conrad >> > >> > >> > > > > > > >> GET /login works fine: >> > >> > >> > > > > > > >> Started GET "/login" for 127.0.0.1 at 2010-02-20 >> 17:45:49 >> > >> > > > > > > >> SQL (0.3ms) SET SQL_AUTO_IS_NULL=0 >> > >> > > > > > > >> Processing by SessionController#new as HTML >> > >> > > > > > > >> Rendered session/new.html.haml within >> > >> > > layouts/application.html.haml >> > >> > > > > > > >> (77.9ms) >> > >> > > > > > > >> Completed in 85ms (Views: 84.1ms | ActiveRecord: >> 0.2ms) >> > >> with 200 >> > >> > >> > > > > > > >> However POST /login gives the following error: >> > >> > >> > > > > > > >> Started POST "/login" for 127.0.0.1 at 2010-02-20 >> 17:45:58 >> > >> > > > > > > >> SQL (0.3ms) SET SQL_AUTO_IS_NULL=0 >> > >> > >> > > > > > > >> ActionController::RoutingError (No route matches >> "/login"): >> > >> > >> > > > > > > >> rake routes returns the expected urls: >> > >> > >> > > > > > > >> login POST /login >> > >> > > > > > > >> {:controller=>"session", :action=>"create"} >> > >> > > > > > > >> GET /login >> > >> > > > > > > >> {:controller=>"session", :action=>"new"} >> > >> > >> > > > > > > >> Thanks, Daniel >> > >> > >> > > > > > > >> -- >> > >> > > > > > > >> You received this message because you are subscribed >> to the >> > >> > > Google Groups >> > >> > > > > > > >> "Ruby on Rails: Talk" group. >> > >> > > > > > > >> To post to this group, send email to >> > >> > > [email protected]. >> > >> > > > > > > >> To unsubscribe from this group, send email to >> > >> > > > > > > >> [email protected]<rubyonrails-talk%[email protected]><rubyonrails-talk%2Bunsubscrib >> [email protected]><rubyonrails-talk%2Bunsubscrib >> > >> [email protected]><rubyonrails-talk%2Bunsubscrib >> > >> > > [email protected]> >> > >> > > > > > > >> . >> > >> > > > > > > >> For more options, visit this group at >> > >> > > > > > > >>http://groups.google.com/group/rubyonrails-talk?hl=en. >> > >> > >> > > -- >> > >> > > You received this message because you are subscribed to the >> Google >> > >> Groups >> > >> > > "Ruby on Rails: Talk" group. >> > >> > > To post to this group, send email to >> > >> [email protected]. >> > >> > > To unsubscribe from this group, send email to >> > >> > > [email protected]<rubyonrails-talk%[email protected]><rubyonrails-talk%2Bunsubscrib >> [email protected]><rubyonrails-talk%2Bunsubscrib >> > >> [email protected]> >> > >> > > . >> > >> > > For more options, visit this group at >> > >> > >http://groups.google.com/group/rubyonrails-talk?hl=en. >> > >> > >> -- >> > >> You received this message because you are subscribed to the Google >> Groups >> > >> "Ruby on Rails: Talk" group. >> > >> To post to this group, send email to >> [email protected]. >> > >> To unsubscribe from this group, send email to >> > >> [email protected]<rubyonrails-talk%[email protected]><rubyonrails-talk%2Bunsubscrib >> [email protected]> >> > >> . >> > >> For more options, visit this group at >> > >>http://groups.google.com/group/rubyonrails-talk?hl=en. >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Ruby on Rails: Talk" group. >> To post to this group, send email to [email protected]. >> To unsubscribe from this group, send email to >> [email protected]<rubyonrails-talk%[email protected]> >> . >> For more options, visit this group at >> http://groups.google.com/group/rubyonrails-talk?hl=en. >> >> > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.

