Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rails应用程序中为refile添加验证?_Ruby On Rails_Ruby On Rails 4_Refile - Fatal编程技术网

Ruby on rails 如何在rails应用程序中为refile添加验证?

Ruby on rails 如何在rails应用程序中为refile添加验证?,ruby-on-rails,ruby-on-rails-4,refile,Ruby On Rails,Ruby On Rails 4,Refile,我有我创建的rails应用程序,所以我可以使用API部分。我可以使用curl成功地将一个文件上传到rails应用程序的DB中,但我不知道如何将文件类型/内容类型限制为CSV csv_file.rb#模型 类CsvFile“文本/csv” # http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/ 附件:csv,扩展名:“csv”,内容类型:“文本/csv” 结束 csv_files.rb#控制器 class AP

我有我创建的rails应用程序,所以我可以使用API部分。我可以使用curl成功地将一个文件上传到rails应用程序的DB中,但我不知道如何将文件类型/内容类型限制为CSV

csv_file.rb#模型

类CsvFile“文本/csv” # http://ryanbigg.com/2009/04/how-rails-works-2-mime-types-respond_to/ 附件:csv,扩展名:“csv”,内容类型:“文本/csv” 结束 csv_files.rb#控制器

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
类API::V1::CsvFilesController@error.serializer
结束
结束
def更新
结束
def删除
结束
私有的
def csv_参数
结束
结束

我看不出您的代码有任何错误,因此这可能是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
您可能希望改用文件扩展名,因为
内容类型有时不可用

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

在这方面我不信任客户,但即使是Refile也取决于客户的
内容类型
,因此它没有什么不同。

因此出现了一些问题

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

def csv_params
    params.permit(:csv_file)
end
其次,我需要在迁移中添加一列

add_column :csv_files, :csv_file_id, :string
最后,我能够修改
csv_文件.rb
模型文件并添加以下行

attachment :csv_file, extension: "csv"

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

您是否在询问这是否可行?或者您尝试了这个,但没有成功?当前代码已实现,并且似乎不起作用,因为我可以上传非CSV的文件。什么显示/告诉你它不起作用?我仍然可以上传非CSV的文件。尝试将
raise\u errors:true
选项添加到
附件
定义中,看看会发生什么。我尝试将两个示例都放在我的
CSV\u文件.rb
模型文件中,但是rails仍然给了我一个错误,
namererror(未定义的局部变量或方法
csv\u filename'):app/models/csv\u file.rb:16:in
csv\u extension'app/controllers/api/v1/csv\u files\u controller.rb:41:in
create“您的设置有问题。Refile将获取附件定义,在本例中为csv,并将_fulename附加到它。大小和内容类型相同。所以我会仔细检查那里发生了什么。如果上面的代码是正确的,就不应该从Rails中得到这个错误。附言:你在使用大师的宝石吗?您使用的是什么版本?在我的rails应用程序
Gemfile
中,我有以下几行,
gem'refile',require:'refile/rails'gem'refile-mini_magick'
您是否愿意在chat.stackoverflow.com上的Ruby聊天室中进一步讨论这个问题?您需要使用Github上的master。将第一行更改为
gem'refile',github:'refile/refile',require:'refile/rails'
attachment :csv_file, extension: "csv"