Rails 4 Paperclip with Devise,文件保存错误

Posted

技术标签:

【中文标题】Rails 4 Paperclip with Devise,文件保存错误【英文标题】:Rails 4 Paperclip with Devise, file saving error 【发布时间】:2014-07-29 20:00:52 【问题描述】:

我正在使用带有回形针的 devise gem 来处理身份验证和上传图片。问题是我在同一个模型上使用了两次回形针来存储两张图片(让我们称这些回形针列:avatar,:superbadge),我的模型名称是用户。

现在,当我选择上传两张图片时,我的 rails 应用程序会忽略我选择的第一个文件,而是使用第二个选择的文件并将其保存在 第一个回形针列中,将第二个回形针列留空乙>。我该如何解决?

我的应用程序控制器:

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception

  before_action :configure_devise_permitted_parameters, if: :devise_controller?

  protected

    def configure_devise_permitted_parameters
        registration_params = [:name, :email, :password, :password_confirmation,:avatar,:superstarbadge]

        if params[:action] == "update"
          devise_parameter_sanitizer.for(:account_update) 
            |u| u.permit(registration_params << :current_password)
          
        elsif params[:action] == "create"
          devise_parameter_sanitizer.for(:sign_up) 
            |u| u.permit(registration_params)
          
        end 
    end
end

我的 User.rb 模型:

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :validatable
  has_attached_file :avatar, :styles =>  :small => "100x100>" 
  validates_attachment_content_type :avatar, :content_type => /\Aimage\/.*\Z/

  has_attached_file :superstarbadge, :styles =>  :tiny => "100x100>" , :default => "superbadge.jpg" 
  validates_attachment_content_type :superstarbadge, :content_type => /\Aimage\/.*\Z/

  has_many :questions
  has_many :answers

  def to_s
    email
  end
end

我的 form_for 用于使用 devise gem 创建新用户(我使用的是苗条模板语言而不是 erb):

h1 Sign up

= form_for(resource, as: resource_name, url: registration_path(resource_name), :html =>  :multipart => true ) do |f|
  = devise_error_messages!

  .field
    label= f.label :name
    = f.text_field :name, autofocus: true

  .field
    label= f.label :email
    = f.email_field :email, autofocus: true

  .field
    label= f.label :password
    = f.password_field :password, autocomplete: 'off'

  .field
    label= f.label :password_confirmation
    = f.password_field :password_confirmation, autocomplete: 'off'

  .field
    = f.label :avatar
    = f.file_field :avatar

  .field 
    = f.file_field :avatar

  div
    = f.submit "Sign up"

【问题讨论】:

您的两个file_field 都用于:avatar,您不希望其中一个用于:superbadge 我需要新眼镜,谢谢 :) 【参考方案1】:

您的表单中的两个 file_field's 都引用 avatar 字段,因此当您提交表单时,第二个选择的文件(即 最新)将保存为 @987654322 @。 superstarbadge 没有 file_field,所以它永远不会被保存。

avatar 需要一个 file_fieldsuperstarbadge 需要另一个。因此,您的代码应如下所示:

.field
  = f.label :avatar
  = f.file_field :avatar

.field 
  = f.file_field :superstarbadge ## This one should be superstarbadge and NOT avatar

【讨论】:

以上是关于Rails 4 Paperclip with Devise,文件保存错误的主要内容,如果未能解决你的问题,请参考以下文章

在 Paperclip 和 Rails 4 中将 Jcrop 坐标转换为 convert_options

如何使用Paperclip在Rails 4中上传多个图像

Rails 3 和 Paperclip:“'identify' 命令无法识别”

Paperclip + Rails 与负载平衡机器

Rails 和 Paperclip - 调整大小问题

Rails:Paperclip 为相似的视频产生不同的结果