0

私のコードはこれです

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

次に、このエラーが発生します

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

3 に答える 3

2

使用する:

@tracking = Tracking.where(:user_id => current_user.id, :target_user_id => @user.id).first
于 2013-08-07T08:12:24.623 に答える
1

Trackingメソッドの結果がではなく の配列を返すため、このエラーが発生していますTrackings

1 つだけに一致する条件をさらに導入するか、 メソッドTrackingを使用するfirstか、結果を反復処理します。

最初に使用するには:

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

繰り返す:

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
于 2013-08-07T08:19:52.443 に答える
0

最適化された答え、

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

その他の便利なメソッドはこちら

于 2013-08-07T08:56:53.510 に答える