Haruka YAGNI
2011-Apr-29 10:16 UTC
How to set new object fields with not-hash object in ActiveRecord?
Hi, everyone. I am using Geokit and Geokit-Rails3 on Ruby on Rails 3.0.3 / Ruby 1.8.7. My model Location (which acts_as_mappable) is often created with lat and lng. For avoiding repeating yourself, I tried to override initialize method and try to use Geokit::LatLng.normalize (this method creates a LatLng object from string/array/etc..), but the following codes does not work, and show curious errors. There are also tests using the original style (:lat=>..., :lng=>...) and they works fine. According to "p ll" in location.rb, ll is correct. Thanks in advance. -- location.rb class Location < ActiveRecord::Base acts_as_mappable :default_units=>:kms, :default_formula=>:flat attr_accessible :lat, :lng def initialize(args) begin ll = Geokit::LatLng.normalize(args) p ll lat = ll.lat; lng = ll.lng rescue super end end end -- a part of location_spec.rb it "should make new Location from LatLng object" do Location.create!(Geokit::LatLng.normalize("35,135")).lat.should == 35 end it "should make new Location from String" do Location.create!("35, 150").lat.should == 35 end it "should make new Location from Array" do p Location.new([35,150])#.lat.should == 35 end -- errors (shortly) NoMethodError: ... while evaluationg nil.[] NoMethodError: undefined method `has_key?'' for nil:NilClass (in `p'') -- 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Frederick Cheung
2011-Apr-29 15:29 UTC
Re: How to set new object fields with not-hash object in ActiveRecord?
On Apr 29, 11:16 am, Haruka YAGNI <hya...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> Hi, everyone. > I am using Geokit and Geokit-Rails3 on Ruby on Rails 3.0.3 / Ruby > 1.8.7. > > My model Location (which acts_as_mappable) is often created with lat > and lng. > > For avoiding repeating yourself, I tried to override initialize method > and try to use Geokit::LatLng.normalize (this method creates a LatLng > object from string/array/etc..), but the following codes does not > work, and show curious errors. > > There are also tests using the original style (:lat=>..., :lng=>...) > and they works fine. > According to "p ll" in location.rb, ll is correct. > > Thanks in advance. > > -- location.rb > class Location < ActiveRecord::Base > acts_as_mappable :default_units=>:kms, :default_formula=>:flat > attr_accessible :lat, :lng > > def initialize(args) > begin > ll = Geokit::LatLng.normalize(args) > p ll > lat = ll.lat; lng = ll.lng > rescue > super > endThis doesn''t actually set your attributes, it just creates 2 local variables. Moreover, you''re not (unless an exception is thrown) calling super, so active record''s internal state isn''t setup correctly - somethig like super(:lat => ll.lat, :lng => ll.lng) is probably alright. You probably also want to be careful of the case where the object is being loaded from the database Fred> end > end > > -- a part of location_spec.rb > it "should make new Location from LatLng object" do > Location.create!(Geokit::LatLng.normalize("35,135")).lat.should > == 35 > end > > it "should make new Location from String" do > Location.create!("35, 150").lat.should == 35 > end > > it "should make new Location from Array" do > p Location.new([35,150])#.lat.should == 35 > end > > -- errors (shortly) > NoMethodError: ... while evaluationg nil.[] > NoMethodError: undefined method `has_key?'' for nil:NilClass (in `p'')-- 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.
Haruka YAGNI
2011-Apr-30 00:12 UTC
Re: Re: How to set new object fields with not-hash object in ActiveRecord?
Fred, thanks for your reply. On Sat, Apr 30, 2011 at 12:29 AM, Frederick Cheung <frederick.cheung-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> > > On Apr 29, 11:16 am, Haruka YAGNI <hya...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: >> Hi, everyone. >> I am using Geokit and Geokit-Rails3 on Ruby on Rails 3.0.3 / Ruby >> 1.8.7. >> >> My model Location (which acts_as_mappable) is often created with lat >> and lng. >> >> For avoiding repeating yourself, I tried to override initialize method >> and try to use Geokit::LatLng.normalize (this method creates a LatLng >> object from string/array/etc..), but the following codes does not >> work, and show curious errors. >> >> There are also tests using the original style (:lat=>..., :lng=>...) >> and they works fine. >> According to "p ll" in location.rb, ll is correct. >> >> Thanks in advance. >> >> -- location.rb >> class Location < ActiveRecord::Base >> acts_as_mappable :default_units=>:kms, :default_formula=>:flat >> attr_accessible :lat, :lng >> >> def initialize(args) >> begin >> ll = Geokit::LatLng.normalize(args) >> p ll >> lat = ll.lat; lng = ll.lng >> rescue >> super >> end > This doesn''t actually set your attributes, it just creates 2 local > variables. > Moreover, you''re not (unless an exception is thrown) calling super, so > active record''s internal state isn''t setup correctly - somethig like > super(:lat => ll.lat, :lng => ll.lng) is probably alright.Thanks, it passes the test. super(in rescue) is called when the parameter is a normal hash, because Geokit::LatLng.normalize throws an exception when it cannot make LatLng object from the argument, and LatLng does not support a hash.> You probably also want to be careful of the case where the object is > being loaded from the databaseSome sites warns that AR does not call initialize method on loading a object from DB. I just use my custom initialization on newly creating a object from a form input. As long as I tested (just make a new object and load it), this method works without problem. Is there possibility of some bugs? How can I test it?> > Fred > > >> end >> end >> >> -- a part of location_spec.rb >> it "should make new Location from LatLng object" do >> Location.create!(Geokit::LatLng.normalize("35,135")).lat.should >> == 35 >> end >> >> it "should make new Location from String" do >> Location.create!("35, 150").lat.should == 35 >> end >> >> it "should make new Location from Array" do >> p Location.new([35,150])#.lat.should == 35 >> end >> >> -- errors (shortly) >> NoMethodError: ... while evaluationg nil.[] >> NoMethodError: undefined method `has_key?'' for nil:NilClass (in `p'') > > -- > 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org > To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. > For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en. > >-- Haruka YAGNI hyagni-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org -- 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 rubyonrails-talk-/JYPxA39Uh5TLH3MbocFF+G/Ez6ZCGd0@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en.