ユーザーが自分のプロファイルにアバターを選択する必要があるという要件があります。プロファイルの編集ページで、ユーザーは[画像の変更]リンクをクリックすると、別のページに移動し、FacebookまたはGravatarから写真を取得するための2つのリンクが表示されます。このページに表示されている画像のプレビューと、保存ボタンもあります。このページのコントローラーはAvatarsControllerです。ルートがavatar/facebook、およびavatar / gravatarのようになるように、編集および更新アクションと、FacebookおよびGravatarのカスタムGETアクションがあります。これらのアクションは、それぞれのサービスにクエリを実行し、写真のURLを含む新しいアバターモデルを作成するだけです。ユーザーが[保存]をクリックすると、更新アクションが呼び出され、アバターモデルがプロファイルとともに保存されます。ページは、ユーザーが作成されたときのデフォルトのように、編集テンプレートによって配信されます。
プロファイルモデル(モンゴイドを使用)は、基本的に次のようになります。
def Profile
embeds_one :avatar
end
アバターモデルは次のようになります。
def Avatar
embedded_in :profile
end
ルートは次のようになります。
resource :avatar, only: [:edit, :update] do
member do
get 'facebook'
get 'gravatar'
end
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
これは機能しますが、Railsはかなり新しいので、Railsの専門家が「facebook」と「gravatar」のリソースを別の方法で、おそらくもっとRESTfulな方法で設定したのではないかと思います。