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
-~----------~----~----~----~------~----~------~--~---

Reply via email to