2011-02-09 20 views
1

ユーザーがログインしてログアウトでき、新しいアカウントを作成できるRuby on Railsアプリケーションを作成しました。ユーザーは整数「ran​​kid」を持ち、rankidに応じてサイトに対して異なる権限を持ちます。Ruby On Rails - オブジェクト設定値

は、私は、ユーザーがROOTURL/upgradeに行くことによって次のランクにアップグレードできるようにしたい - 私のroutes.rbをして、私は以下の持っているので:

私のユーザーのコントローラで、次の方法を使用しています
map.connect '/upgrade', :controller => 'users', :action => 'upgrade' 

def upgrade 
    @CurrentID = session[:user_id] 
    @user = User.find(@CurrentID) 

    if @user.rankid = 0 
    @user.rankid = 1 
    redirect_to root_url, :notice => "Upgraded to VIP!" 
    return 
    end 
    if @user.rankid = 1 
    @user.rankid = 2 
    redirect_to root_url, :notice => "Upgraded to Admin!" 
    return 
    end 
end 

私はthis tutorialを使用して認証を設定しましたが、それがなぜ機能しないのか分かりません。 申し訳ありませんが、これは本当に愚かな間違いです - 私はRubyとRailsの両方にとても新しいです。

+1

全く愚かな間違いがありません。ちょうど学ぶ。 – MattC

答えて

1

まず、あなたのif文ではなく、0にそれを設定するので0@user.rankidを比較する二重の等号が必要です。

if @user.rankid == 0 

次に、更新後にユーザーを保存することはありません。最後に、2番目のブロックでelsifを使用します。そうしないと、ユーザーはVIPにアップグレードされ、すぐに管理者にアップグレードされます。 else/elsifを使用すると、return文をハードコードする必要はありません。

全コード:

def upgrade 
    @user = User.find(session[:user_id]) 
    if @user.rankid == 0 
    @user.update_attributes(:rankid => 1) 
    redirect_to root_url, :notice => "Upgraded to VIP!") 
    elsif @user.rankid == 1 
    @user.update_attributes(:rankid => 2) 
    redirect_to root_url, :notice => "Upgraded to Admin!" 
    end 
end 
+0

ああ、ありがとう!なんらかの理由で、私は "="がRubyの比較演算子であると考えました(if文で使用すると操作が変更されました)。 –

0

あなたはセッション設定する[を:USER_ID]ユーザーがユーザー#アクション、すなわち、ログインをアップグレードする前に当たりますか?

あなたはまた、余分な変数をスキップして、ちょうど

@user = User.find(session[:user_id]) 

を使用しかし、あなたが行くと使用する前に、結果はあなたが実際に役に立つ何かを得ることを確認することができますバック

if @user 
    @user.rankid += 1; 
    @user.save # Maybe even error check this 
    case @user.rankid 
    when 1 
    notice = "Upgraded to VIP!" 
    when 2 
    notice = "Upgraded to Admin!" 
    else 
    notice = "r00t!" 
    end 
    redirect_to root_url, :notice => notice 
    return 
else 
    # some problem with your user or missing session[:user_id] 
end