如何在 rails 应用程序中添加验证以重新归档?
How to add validation to refile within a rails app?
我创建了 rails 应用程序,因此我可以使用其中的 API 部分。我可以使用 curl 将文件成功上传到 rails 应用程序的数据库,但我不知道如何将文件类型/内容类型限制为 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 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
我看不出你的代码有什么问题,所以这可能是 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
所以它没什么不同。
所以最后出现了几个问题。
首先,controller中的strong参数应该是这样的,
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。
我创建了 rails 应用程序,因此我可以使用其中的 API 部分。我可以使用 curl 将文件成功上传到 rails 应用程序的数据库,但我不知道如何将文件类型/内容类型限制为 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 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
我看不出你的代码有什么问题,所以这可能是 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
所以它没什么不同。
所以最后出现了几个问题。
首先,controller中的strong参数应该是这样的,
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。