MKK
MKK

Reputation: 2753

Why am I getting undefined method 'save' error?

My code is this

def footstamp
    if current_user
        @user = User.find(params[:id])
        @tracking = Tracking.where(:user_id => current_user.id, :target_user_id => @user.id)

        if @tracking
            @tracking.accessed_at = Time.now
            @tracking.save          
        else
            @tracking = Tracking.new
            @tracking.user_id = current_user.id
            @tracking.target_user_id = @user.id
            @tracking.accessed_at = Time.now
            @tracking.save          
        end
    end     
end

Then I get this error

NoMethodError (undefined method `save' for []:ActiveRecord::Relation):

Upvotes: 0

Views: 55

Answers (3)

Thaha kp
Thaha kp

Reputation: 3709

Optimised answer,

def footstamp
    if current_user
        @user = User.find(params[:id])
        @tracking = Tracking.where(:user_id => current_user.id, :target_user_id => @user.id).first_or_create
        @tracking.accessed_at = Time.now
        @tracking.save          
    end     
end

More usefull methods here

Upvotes: 0

Paulo Fidalgo
Paulo Fidalgo

Reputation: 22331

You are getting this error because the result of your method do not return a Tracking, but an array of Trackings.

Either you introduce more conditions to match only one Tracking, or use the first method or iterate over the results,

To use first:

@tracking = Tracking.where(:user_id => current_user.id, :target_user_id => @user.id).first

Iterate:

Tracking.where(:user_id => current_user.id, :target_user_id => @user.id).each do |tracking|
        if tracking
            tracking.accessed_at = Time.now
            tracking.save          
        else
            tracking = Tracking.new
            tracking.user_id = current_user.id
            tracking.target_user_id = @user.id
            tracking.accessed_at = Time.now
            tracking.save          
        end
end

Upvotes: 1

Aman Garg
Aman Garg

Reputation: 4218

Use:

@tracking = Tracking.where(:user_id => current_user.id, :target_user_id => @user.id).first

Upvotes: 2

Related Questions