我有用户模型,用户应该能够将一张图片上传为头像。但我真的不知道如何以正确的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 %>
但我也不喜欢这种态度,因为我的更新操作已经处理了另一种形式,处理重定向等会非常难看。
答案 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)
如果我理解正确:
在这一点上要弄清楚的最重要的事情是:用户和阿凡达之间关系的基数是什么。用户是否拥有一个头像或多个?如果存在一对多的关系,那么像Jonnii提出的解决方案可能会有意义。
如果一个用户只有一个阿凡达(看起来很可能),我会考虑使用最简单的解决方案并将阿凡达设为用户属性。
虽然我还没有尝试过,但我听说过有关Paperclip的好消息。该示例使用甚至讨论使用Paperclip与头像。
对于更轻量级的解决方案,您可以考虑使用Gravatar,这样就不需要完全上传文件并简化了很多事情。