Reputation: 2753
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
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
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
Reputation: 4218
Use:
@tracking = Tracking.where(:user_id => current_user.id, :target_user_id => @user.id).first
Upvotes: 2