如何以REST方式处理头像上传

时间:2009-09-08 18:56:56

标签: ruby-on-rails rest

我有用户模型,用户应该能够将一张图片上传为头像。但我真的不知道如何以正确的REST方式实现它。我看到两个选项

首先,我将avatar视为属于用户的会员资源,因此我向用户控制器添加了两个操作,上传表单添加了一个头像,第二个用于处理实际上传 avatar_upadte 的操作,因此我的路线看起来像

map.resources :users, :member => { :avatar => :get, :avatar_update => :post }

其次,我可以将头像视为单独的资源,并创建头像控制器,这就像

map.resources :users
map.resources :avatars, :only => [ :new, :create ]

我不想在edit_user行动中处理头像上传,因为它已经非常复杂了。

第三个选项可能是只有头像操作来显示表单,然后用户REST用户更新操作作为上传目标,其中表单将是这样的

<% form_for @user, :url => user_path(@user), :html => { :multipart => true } do |f| %>
    <%= f.label :avatar, 'Avatar' %>
    <%= f.file_field :avatar %>
    <%= f.submit 'Upload' %>
<% end %>   

但我也不喜欢这种态度,因为我的更新操作已经处理了另一种形式,处理重定向等会非常难看。

2 个答案:

答案 0 :(得分:3)

对于我工作的应用,我们会这样做:

map.resources :users do |u|
    u.resources :avatars # You can also make this a singleton resource
end

这会为您提供如下路线:/users/1/avatars/new

这可能对您的应用没有意义,如果不是,我会选择使用单独的AvatarsController。

答案 1 :(得分:1)

如果我理解正确:

  • 选项1向User资源添加自定义操作,如果可能的话,最好避免使用。
  • 选项2将用户和头像分成不同的资源,但不能轻易连接两者(例如,在创建上传表单时)。
  • 选项3看起来像您将“头像”视为“用户”属性。

在这一点上要弄清楚的最重要的事情是:用户和阿凡达之间关系的基数是什么。用户是否拥有一个头像或多个?如果存在一对多的关系,那么像Jonnii提出的解决方案可能会有意义。

如果一个用户只有一个阿凡达(看起来很可能),我会考虑使用最简单的解决方案并将阿凡达设为用户属性。

虽然我还没有尝试过,但我听说过有关Paperclip的好消息。该示例使用甚至讨论使用Paperclip与头像。

对于更轻量级的解决方案,您可以考虑使用Gravatar,这样就不需要完全上传文件并简化了很多事情。