【问题标题】:Validate a model验证模型
【发布时间】:2014-03-31 17:55:49
【问题描述】:

我有一个文件字段供想要上传个人资料图片的人使用:

<%= f.file_field :file %>

一切正常,但是,我不知道如何验证它。

这是我的创建操作,一切正常,但是像我这样拆分参数哈希可能是错误的:

def create
    new_user_params = user_params

    image_params = user_params[:profile_image_attributes]
    new_user_params.delete("profile_image_attributes")

    @user = User.new(new_user_params)


    respond_to do |format|
      if @user.save

        @user.create_thumbnail(image_params)

        sign_in @user

        format.html { redirect_to @user, notice: 'Welcome to ' + request.host_with_port + ', ' + @user.user_name + '!' }
        format.json { render action: 'show', status: :created, location: @user }
      else
        format.html { render action: 'new' }
        format.json { render json: @user.errors, status: :unprocessable_entity }
      end
    end
end

这是user#create_thumbnail 方法:

def create_thumbnail(data)

    upload =  data['file'].read

    img = Magick::Image.from_blob(upload).first

    img.resize!(75,75)      

    transaction do

        self.create_profile_image(path: 'test') 

        img.write 'test' + '.' + img.format.downcase

    end
end

问题:

就像它说的那样,这一切都很完美,但我想知道如何正确地做到这一点,最重要的是,如何阻止人们上传巨大的文件和文件没有带有适当验证错误消息的 .gif、.png .jpg 或 .jpeg 格式...

【问题讨论】:

    标签: ruby-on-rails model image-uploading


    【解决方案1】:

    如果您愿意添加新的 gem,那么我强烈建议您使用流行的 Paperclip gem,它内置了对 file sizecontent type/ extensionpresence 的验证。

    请参阅 Paperclip Github 文档。

    就这么简单

    validates_attachment :image, :presence => true,
      :content_type => { :content_type => ["image/jpg", "image/jpeg", "image/gif", "image/png"] },
      :size => { :in => 0..10.kilobytes }
    

    对于字段名为image(回形针附件)的模型。

    地点:

    :presence 验证在提交表单时附加了文件

    :content_type 验证指定的文件扩展名(mime 类型)。它还将检查上传文件的实际内容。阅读我的findings here

    :size 根据给定范围验证上传的文件大小。

    【讨论】:

    • @user3067865 我的回答是否有助于解决您的问题?告诉我。
    【解决方案2】:

    如果您要上传文件,您可能需要使用PaperclipCarrierwave。它们都具有可轻松解决您遇到的问题的功能。

    回形针:

    您可以在模型中使用验证:

    validates_attachment_presence
    validates_attachment_content_type
    validates_attachment_size
    

    带有回形针的旧 RailsCast:http://railscasts.com/episodes/134-paperclip

    载波:

    您是否指定了上传器类,并且可以从那里添加文件类型和大小的验证。

    class MyUploader < CarrierWave::Uploader::Base
      def extension_white_list
        %w(jpg jpeg gif png)
      end
    end
    

    以 Carrierwave 为特色的旧 RailsCast:http://railscasts.com/episodes/253-carrierwave-file-uploads

    【讨论】:

      【解决方案3】:

      为什么不使用 gem 作为载波呢? https://github.com/carrierwaveuploader/carrierwave

      如果你想使用你的代码为什么不重构一下,例如

      我会做这样的事情,使用一些设计模式。

      def create_thumbnail
        upload_file(read_file(data))
        resize_img
        execute_transaction
      end
      
      def read_file(data)
       data['file'].read
      end
      
      def upload_file(read_file)
        Magick::Image.from_blob(read_file).first
      end
      
      def resize_img
       upload_file.resize!(75,75)
      end
      
      def execute_transaction
         transaction do
      
            self.create_profile_image(path: 'test') 
      
            img.write 'test' + '.' + img.format.downcase
      
         end
      end
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-11
        • 2017-08-16
        • 2014-01-07
        • 2013-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多