2012-04-24 9 views
0

ユーザーは、自分のプロフィールにアバターを選択する必要があります。プロフィールの編集ページで、ユーザーはChange Pictureリンクをクリックして別のページに移動し、FacebookやGravatarから写真を得るために2つのリンクを表示します。また、このページに表示される画像のプレビューと保存ボタンもあります。このページのコントローラーはAvatarsControllerです。私は編集や更新のアクションだけでなく、フェイスブックやグラバターのためのカスタムGETアクションは、経路がアバター/フェイスブックのように見えるように、そしてアバター/グラバター。これらのアクションは、それぞれのサービスに照会し、写真のURLを含む新しいアバターモデルを作成するだけです。ユーザーが保存をクリックすると、更新アクションが呼び出され、アバターモデルがプロファイルと共に保存されます。ページは編集テンプレートによって配信されます。デフォルトでは、ユーザーの作成時に空のアバターも作成されます。アバター選択シナリオ用のRESTfulリソースを構築するための推奨事項

(mongoidを使用)プロファイルモデルは、本質的に以下のようになります

def Profile 
    embeds_one :avatar 
end 

等アバターモデルに見える:

resource :avatar, only: [:edit, :update] do 
    member do 
    get 'facebook' 
    get 'gravatar' 
    end 
end 

コントローラ:ルートがどのように見える

def Avatar 
    embedded_in :profile 
end 

次のようになります。

class AvatarsController < ApplicationController 
    def facebook 
    url = AvatarServices.facebook(current_user, params[:code]) 
    respond_to do |format| 
     unless url 
     format.json { head :no_content } 
     else 
     @avatar = Avatar.new({:url => url, :source => "Facebook"}) 
     @avatar.member_profile = current_user.member_profile 
     format.html { render :edit } 
     format.json { render json: @avatar } 
     end 
    end 
    end 
    def gravatar 
    respond_to do |format| 
     url = AvatarServices.gravatar(current_user) 
     unless url 
     format.json { head :no_content } 
     else 
     @avatar = Avatar.new({:url => url, :source => "Gravatar"}) 
     @avatar.member_profile = current_user.member_profile 
     format.html { render :edit } 
     format.json { render json: @avatar } 
     end 
    end 
    end 
    def edit 
    @avatar = current_user.member_profile.avatar 
    end 
    def update 
    @avatar = current_user.member_profile.avatar 
    respond_to do |format| 
     if @avatar.update_attributes(params[:avatar]) 
     format.html { redirect_to edit_member_profile_path } 
     format.json { head :no_content } 
     else 
     format.html 
     format.json { render json: @avatar.errors } 
     end 
    end 
    end 
end 

これはうまくいきますが、レールにはかなり新しくなっています。レール専門家が 'facebook'と 'gravatar'リソースを別の方法で、おそらくよりRESTfulな方法で設定していたのでしょうか?

答えて

1

まあ、サブフォルダは、共通の名前空間にfacebookとgravatarコントローラを入れています。

resource :avatar, only: [:edit, :update] do 
    resource :facebook 
    resource :gravatar 
end 

これは、FacebooksControllerとGravatarsControllerにルーティングされます。

これはあなたがとにかく考えていたもので、facebookやgravatarレコードのレコードIDは必要ありません。

0

コントローラコードを追加できますか?あなたの行動がどのようにセットアップされているかを知りたいと思っています。

あなたが安らかにしたい場合は、アバター用のコントローラーサブフォルダーを作成し、gravatar & facebook用の後続コントローラーを作成するだけです。あなたはジェネレータを使用してこれを行うことができます

rails g controller avatars/facebook 
rails g controller avatars/gravatar 
+0

コントローラーを追加しました。私も同じ行に沿って、各サービスのコントローラを考えていました。しかし、私は、facebookとgravatarの画像はまだユーザーに属しているアバターのリソースだと思っていましたが、彼らは外部のサービスからちょうど質問されました。 – stantona