Paperclip gem在不同视图中呈现头像上传

时间:2015-12-18 12:52:22

标签: ruby-on-rails ruby paperclip

您好我正在使用paperclip gem,目前我的网站用户可以在我的注册(devise)下的编辑个人资料页面上传他/她的头像,上传代码如下:

  <div class="field">
    <%= f.label :avatar %><br />
    <%= f.file_field :avatar %>
  </div>

有没有办法可以在不同的视图中呈现此头像上传?我该怎么办呢?我想把它放在我的设计视图中,而不是我对用户个人资料的看法。

3 个答案:

答案 0 :(得分:2)

在您的用户个人资料页面上,您可以为当前用户放置包含更新操作的表单。它可能看起来像这样:

用户/注册/ show.html.erb

<% if current_user == @user %>
  <%= form_for current_user, url: { :action => :update } do |f| %>
    <!-- ... -->
    <div class="field">
      <%= f.label :avatar %><br />
      <%= f.file_field :avatar %>
    </div>
    <!-- ... -->
    <div class="actions">
      <%= f.submit %>
    </div>        
  <% end %>
<% end %>

答案 1 :(得分:2)

如果你想在另一个视图中上传头像,你当然可以这样做。

如果您想在设计视图中执行此操作,则必须编辑数据库,模型和控制器。

您可以设置&#34;个人资料&#34;行动没问题,我们这样做here(它只是一个测试应用,你可以免费注册并亲自试用......):

enter image description here

您必须记住User模型与Devise无关 - 您可以随意执行任何操作,无论它是否用于身份验证。

您可以执行以下操作:

#config/routes.rb
resources :profile, controller: :users, only: [:index, :update]

#app/controllers/users_controller.rb
class UsersController < ApplicationController
   def update
      current_user.update avatar_params
   end

   private

   def avatar_params
      params.require(:user).permit(:avatar)
   end
end

#app/views/users/index.html.erb
<%= form_for current_user, multipart: true do |f| %>
    <%= f.label :avatar %><br />
    <%= f.file_field :avatar %>
    <%= f.submit %>
<% end %>

这必须与相应的型号代码等匹配,但应该可以让您上传相应的头像。

您还可以将头像显示在应用的其他部分,例如:

enter image description here

可以使用标准Paperclip image file path helpers

来完成
<%= image_tag @user.avatar.url %>

如果您想将头像绑定到注册过程,则必须将设计控制器编辑为allow the parameters

#app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:user) << :avatar
  end
end

如果你的模型中有正确的设置,这应该允许你在你的Devise注册视图中包含头像上传工具。

答案 2 :(得分:0)

在你看来,你可以像这样显示它

<%= image_tag(@user.image.url %>

或者如果您有不同的尺寸,那么您可以像这样渲染

<%= image_tag(@user.image.url(:original) %> # :original is image defined in model.