On 23 Dec 2008, at 16:43, lee.longm...@googlemail.com wrote:
> > Fred, > > I do have a "changed" method! > > # > # Typically used by "set" accessors to indicate that an attribute > of this object has been changed. > # > def changed > @has_changed = true > end > > Why would this cause a problem? > Because in rails 2.1 there is a changed method that returns the list of attributes that have changed (and thus need to be saved). You're overwriting that method. Fred > On 23 Dec, 16:37, "lee.longm...@googlemail.com" > <lee.longm...@googlemail.com> wrote: >> Fred, >> >> I'll look for "changed". >> >> I can re-create the error in the console - please see below. The >> error >> would suggest that attribute_names in attributes_with_quotes is set >> to >> true though as you can see the 'attributes.keys' for the instance >> being saved seems ok. >> >> *** CONSOLE OUTPUT - r, an existing Root object in the DB, raises an >> error when I try to save it back >> r = Property.find(1) >> => #<Root id: 1, type: "Root", name: "Base of Administrator", >> yaml_container: nil, parent_id: nil, owner_id: 1, custodian_id: 1, >> property_control_id: 1, include_parent_responses: false, inheritable: >> false, response_vehicle_id: nil, acquire_child_values: false, >> description: nil, rating: nil, link_base_id: nil, base_image_id: nil, >> event_when_id: nil, event_description_id: nil>>> r.save >> >> NoMethodError: undefined method `each' for true:TrueClass >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> base.rb:2808:in `attributes_with_quotes' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> base.rb:2706:in `update_without_lock' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> locking/optimistic.rb:70:in `update_without_dirty' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> dirty.rb:146:in `update_without_callbacks' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> callbacks.rb:253:in `update_without_timestamps' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> timestamp.rb:38:in `update' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> base.rb:2699:in `create_or_update_without_callbacks' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> callbacks.rb:222:in `create_or_update' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> base.rb:2383:in `save_without_validation' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> validations.rb:1009:in `save_without_dirty' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> dirty.rb:79:in `save_without_transactions' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> transactions.rb:179:in `send' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> transactions.rb:179:in `with_transaction_returning_status' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> connection_adapters/abstract/database_statements.rb:66:in >> `transaction' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> transactions.rb:129:in `transaction' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> transactions.rb:138:in `transaction' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> transactions.rb:178:in `with_transaction_returning_status' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> transactions.rb:146:in `save' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> transactions.rb:158:in `rollback_active_record_state!' >> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >> active_record/ >> transactions.rb:146:in `save' >> from (irb):24 >> from :0>> r.attributes.keys >> => ["rating", "property_control_id", "name", "yaml_container", >> "event_description_id", "type", "response_vehicle_id", "id", >> "event_when_id", "custodian_id", "description", "base_image_id", >> "owner_id", "acquire_child_values", "link_base_id", "parent_id", >> "include_parent_responses", "inheritable"] >> >> >> >> On 23 Dec, 16:31, Frederick Cheung <frederick.che...@gmail.com> >> wrote: >> >>> On 23 Dec 2008, at 15:44, lee.longm...@googlemail.com wrote: >> >>>> I'm not sure which model is causing the problem. I am now trapping >> >>> It would be the model being saved/created. A method called changed >>> would cause a problem for example. >> >>> Fred >> >>>> exceptions and the error first occurs when I execute root.save (see >>>> ***1***). 'root' is an instance of my Property model. I also get >>>> the >>>> same error when executing code *** 2 *** (which follows the >>>> execution >>>> of *** 1 ***) - member.save forces another (different) instance of >>>> Property to be saved to the properties table which again triggers >>>> the >>>> same error. FYI 'member.create_default_characteristics(user)' (in >>>> *** >>>> 2 ***) calls create_root() (*** 1 ***). The log file also suggests >>>> that both errors are raised on an INSERT into my properties table. >> >>>> *** 1 *** >> >>>> def create_root(administrator) >>>> begin >>>> root = create_root_collection(self.pingee_name, >>>> administrator, >>>> GlobalAccessibility.new, >>>> OwnerAccessibility.new) >>>> root.save >>>> rescue Exception => exe >>>> logger.info("*** Member.create_root #{exe} >>>> #{root.name.to_s} >>>> ***") >>>> end >>>> self.root = root >>>> end >> >>>> *** 2 *** >>>> def self.add_member_for_user(user) >>>> member = new(:user_id => user.id, :pingee_name => >>>> user.pingee_name) >>>> # Create the member's default characteristics and save it all >>>> to the database in a single >>>> # transaction >>>> begin >>>> transaction do >>>> member.create_default_characteristics(user) >>>> member.save! >>>> end >>>> member >>>> rescue Exception => exe >>>> logger.info("*** Member.add_member_for_user #{exe} ***") >>>> end >>>> end >> >>>> On 23 Dec, 15:19, Frederick Cheung <frederick.che...@gmail.com> >>>> wrote: >>>>> On 23 Dec 2008, at 14:04, lee.longm...@googlemail.com wrote: >> >>>>>> I have checked for method/association name clashes and can't see >>>>>> any. >>>>>> Any tips on how I might debug this further would be very much >>>>>> appreciated - I am completely stuck! >> >>>>> You could start by showing the code in your model. If you've got >>>>> any >>>>> plugins you're using it's worth making sure they aren't the >>>>> problem >> >>>>> Fred >> >>>>>> To recap, I am getting the error "undefined method `each' for >>>>>> true:TrueClass" when an Active Record method (in active_record/ >>>>>> base.rb >>>>>> - see below) is being executed. So I assume 'attribute_names' is >>>>>> being >>>>>> set to true for some reason. >> >>>>>> # Returns a copy of the attributes hash where all the values >>>>>> have been safely quoted for use in >>>>>> # an SQL statement. >>>>>> def attributes_with_quotes(include_primary_key = true, >>>>>> include_readonly_attributes = true, attribute_names = >>>>>> @attributes.keys) >>>>>> quoted = {} >>>>>> connection = self.class.connection >>>>>> attribute_names.each do |name| >>>>>> if (column = column_for_attribute(name)) && >>>>>> (include_primary_key || !column.primary) >>>>>> value = read_attribute(name) >> >>>>>> # We need explicit to_yaml because quote() does not >>>>>> properly convert Time/Date fields to YAML. >>>>>> if value && self.class.serialized_attributes.has_key? >>>>>> (name) && (value.acts_like?(:date) || value.acts_like?(:time)) >>>>>> value = value.to_yaml >>>>>> end >> >>>>>> quoted[name] = connection.quote(value, column) >>>>>> end >>>>>> end >>>>>> include_readonly_attributes ? quoted : >>>>>> remove_readonly_attributes(quoted) >>>>>> end >> >>>>>> On 20 Dec, 14:26, Frederick Cheung <frederick.che...@gmail.com> >>>>>> wrote: >>>>>>> On Dec 20, 1:52 pm, >>>>>>> "lee.longm...@googlemail.com"<lee.longm...@googlemail.com> >>>>>>> wrote: >>>>>>>> To add, I am seeing the following when I retrieve an existing >>>>>>>> Root >>>>>>>> object in the Rails console and then try to save it again: >> >>>>>>> My guess would be that you have a method or an association >>>>>>> with a >>>>>>> name >>>>>>> that has since been used internally by activerecord. If you can >>>>>>> show >>>>>>> more of your model someone might be able to spot the >>>>>>> troublemaker. >> >>>>>>> Fred >> >>>>>>>> => #<Root id: 1, type: "Root", name: "Base of Administrator", >>>>>>>> yaml_container: nil, parent_id: nil, owner_id: 1, >>>>>>>> custodian_id: 1, >>>>>>>> property_control_id: 1, include_parent_responses: false, >>>>>>>> inheritable: >>>>>>>> false, response_vehicle_id: nil, acquire_child_values: false, >>>>>>>> description: nil, rating: nil, link_base_id: nil, >>>>>>>> base_image_id: >>>>>>>> nil, >>>>>>>> event_when_id: nil, event_description_id: nil>>> root.save >> >>>>>>>> NoMethodError: undefined method `each' for true:TrueClass >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> base.rb:2808:in `attributes_with_quotes' >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> base.rb:2706:in `update_without_lock' >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> locking/optimistic.rb:70:in `update_without_dirty' >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> dirty.rb:146:in `update_without_callbacks' >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> callbacks.rb:253:in `update_without_timestamps' >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> timestamp.rb:38:in `update' >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> base.rb:2699:in `create_or_update_without_callbacks' >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> callbacks.rb:222:in `create_or_update' >>>>>>>> from /usr/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/ >>>>>>>> active_record/ >>>>>>>> base.rb:2383:in `save_without_validation' >> >> ... >> >> read more ยป > > --~--~---------~--~----~------------~-------~--~----~ 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@googlegroups.com To unsubscribe from this group, send email to rubyonrails-talk+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---