2011-07-08 13 views
2

私は物事をやってゆっくりと学習していますが、私はブロックに入っています。私は単純なレール3.1アプリを持っていて、単純なユーザー登録/サインインのプロセスがあります。私はむしろ自分でそれをやる方法を学ぶので、私は念力を使っていません。Rails 3.1のみのユーザーは、プロフィールを編集できます

現在、ユーザーは登録、サインイン、サインアウトができます。しかし、私は彼らのプロフィールを編集できるようにしたい。現在、どのユーザーもIDが1に設定されていなくても、ユーザー/ 1 /編集/に行くことができます。どのようにすれば、current_userがURLのものと一致するかどうかを確認できますか?私は私のusers_controllerの編集アクションの前にある種のフィルタが必要であることを知っています。ここで

は私が存在

users_controller.rb

before_filter :is_owner, :only => [:edit, :update, :destroy] 

application_controller.rbで持っているものである

helper_method :is_owner 
def is_owner 
end 

私is_owner機能で何をすべきですか?

答えて

3

私はあなたの問題がURLからパラメータを取得することにあると推測しています。これは、params配列で行うことができます。それに

params[:id] 

を(!あなたのルーティングの設定に応じて)、あなたは

def is_owner? 
    current_user.id == params[:id] 
end 
2

Fuzzyalejが私よりも明らかに速いタイパーであるような何かを行うことができます;-) 、私はあなたにもっと冗長な形式の関数を提案することができます。

ApplicationControllerでフィルタメソッドを定義しましたが、この場合、 'id'パラメータだけを比較すると誤解を招く可能性があります。他のアクションでは 'id'がドキュメントを記述することがあるためです)を使用します。 UsersControllerでフィルタ関数を定義するともっと安全です(専用の関数にしてください)

個人的には、私はしばしば類似の規則を直接アクションに入れますが、フィルタを使用するほうがDRYが多いことがあります。

私は方法「編集」、「更新」と、このように「破棄」を定義します

def edit # and 'update', and 'destroy' 
    @user = User.find(params[:id]) 
    render_forbidden and return unless can_edit? 
    # ...and the rest of the action 
end 

private 

def can_edit? 
    current_user.is_admin? || current_user == @user 
end 

# This one usually is defined in ApplicationController, as I use it often 
def render_forbidden 
    respond_to do |format| 
    format.html { render :action => "errors/forbidden", :status => 403 } 
    #... 
    end 
    true 
end 
(多分あなたはそれを好きになるでしょう)
関連する問題