如何在rails应用程序中添加验证以进行重新设置?

时间:2015-10-17 19:16:55

标签: ruby-on-rails ruby-on-rails-4 refile

我有我创建的rails应用程序,所以我可以使用API​​部分的东西。我可以使用curl将文件成功上传到rails app的数据库,但我无法弄清楚如何将文件类型/内容类型限制为CSV。

csv_file.rb #model

class CsvFile < ActiveRecord::Base
    # attachment :content_type => "text/csv"
    # http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/
    attachment :csv, extension: "csv", content_type: "text/csv"
end

csv_files.rb #controller

class API::V1::CsvFilesController < ApplicationController

  # see http://stackoverflow.com/questions/15040964/ for explanation
  skip_before_filter :verify_authenticity_token

  def index
    @csv_files = CsvFile.all
    if @csv_files
      render json: @csv_files,
        # each_serializer: PictureSerializer,
        root: "csv_files"
    else
      @error = Error.new(text: "404 Not found",
                          status: 404,
                          url: request.url,
                          method: request.method)
      render json: @error.serializer
    end 
  end

  def show
    if @csv_file
      render json: @csv_file,
              # serializer: PictureSerializer,
              root: "csv_file"
    else
      @error = Error.new(text: "404 Not found",
                          status: 404,
                          url: request.url,
                          method: request.method)
      render json: @error.serializer
    end
  end

  # POST /csv_files.json
  def create
    @csv_file = CsvFile.new(csv_params)

    if @csv_file.save
      render json: @csv_file,
        # serializer: PictureSerializer, 
        meta: { status: 201,
          message: "201 Created"},
          root: "csv_file"
    else
      @error = Error.new(text: "500 Server Error",
        status: 500,
        url: request.url,
        method: request.method)
      render :json => @error.serializer
    end
  end

  def update
  end

  def delete
  end

  private

  def csv_params

  end
end

2 个答案:

答案 0 :(得分:1)

我无法看到您的代码有任何问题,因此这可能是Refile中的错误。我唯一可以建议的是使用自定义验证器。

validate :csv_extension

private

def csv_extension
  unless csv_content_type == "text/csv"
    errors.add :csv, "format must be csv" # might want to use i18n here.
  end
end

您可能希望使用文件扩展名,因为有时无法使用content_type

def csv_extension
  unless File.extname(csv_filename) == "csv"
    errors.add :csv, "format must be csv"
  end
end

我不会相信客户对这些东西的看法,但即使是Refile也取决于content_type的客户端,所以它几乎没有什么不同。

答案 1 :(得分:0)

所以最终出现了一些问题。

首先,控制器中的强参数应如下所示,

def csv_params
    params.permit(:csv_file)
end

其次,我需要在迁移中添加一列,

add_column :csv_files, :csv_file_id, :string

最后,我能够修改csv_file.rb模型文件并添加以下行。

attachment :csv_file, extension: "csv"

目前,只有扩展名为.csv的文件才能上传到API。