0

ユーザーが自分のプロファイルにアバターを選択する必要があるという要件があります。プロファイルの編集ページで、ユーザーは[画像の変更]リンクをクリックすると、別のページに移動し、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な方法で設定したのではないかと思います。

4

2 に答える 2

1

サブフォルダーは、FacebookとGravatarのコントローラーを共通の名前空間に配置しています。ネストされたルートを使用できます。

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

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

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

于 2012-04-24T16:26:26.977 に答える
0

コントローラコードを追加してもらえますか?アクションがどのように設定されているのか興味があります。

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

rails g controller avatars/facebook
rails g controller avatars/gravatar
于 2012-04-24T15:18:49.620 に答える