0

我们有一个要求,用户需要为其个人资料选择头像。在编辑个人资料页面上,用户单击更改图片链接,该链接将他们带到另一个页面,并为他们提供两个链接以从 Facebook 或 gravatar 获取他们的照片。此页面上还显示了图像的预览,以及保存按钮。此页面的控制器是 AvatarsController。我有编辑和更新操作,以及 facebook 和 gravatar 的自定义 GET 操作,因此路线看起来像 avatar/facebook 和 avatar/gravatar。这些操作只是查询相应的服务并创建一个包含照片 url 的新头像模型。当用户单击保存时,将调用更新操作并将头像模型与配置文件一起保存。该页面由编辑模板交付,默认情况下,创建用户时,

Profile 模型(使用 mongoid)本质上看起来像:

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 回答