Ruby on rails 如何在rails应用程序中为refile添加验证?
我有我创建的rails应用程序,所以我可以使用API部分。我可以使用curl成功地将一个文件上传到rails应用程序的DB中,但我不知道如何将文件类型/内容类型限制为CSV csv_file.rb#模型 类CsvFileRuby 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
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:incsv\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"