为rails中的头像选择场景构建RESTful资源的建议

时间:2012-04-24 14:38:00

标签: ruby-on-rails rest rails-routing

我们要求用户需要为其个人资料选择他们的头像。在编辑个人资料页面上,用户点击更改图片链接,该链接将他们带到另一个页面,并为他们提供两个链接,以从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'资源?

2 个答案:

答案 0 :(得分:1)

好吧,子文件夹将facebook和gravatar控制器放入一个公共命名空间。您可以使用嵌套路由

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

这将路由到FacebooksController和GravatarsController。

无论如何,这都是你的想法,你不需要记录facebook或者gravatar唱片的记录。

答案 1 :(得分:0)

您可以添加控制器代码吗?我很想知道你如何设置你的行动。

如果你想保持安静,可能只需要为头像创建一个控制器子文件夹,并为gravatar创建后续控制器。 Facebook的。您只需使用生成器即可完成此操作

rails g controller avatars/facebook
rails g controller avatars/gravatar