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