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