Ruby 在rails的switch/if语句中使用regex标识上传后的文件扩展名

Ruby 在rails的switch/if语句中使用regex标识上传后的文件扩展名,ruby,regex,ruby-on-rails-3,file-upload,Ruby,Regex,Ruby On Rails 3,File Upload,我正在开发一个解析各种形式电子表格的应用程序。它适用于CSV,现在我正尝试使用RooGem将其扩展到XLS、XLSX、ODS和Google电子表格 我希望上传的文件能够根据文件名正确解析。我曾尝试使用regex和switch以及if语句来实现这一点,但到目前为止,还没有成功。问题似乎在正则表达式的条件内,因为即使CSV文件也不再被解析 以下是我目前的版本: def create @deck = Deck.new @deck.name = params[:uploadform][:name

我正在开发一个解析各种形式电子表格的应用程序。它适用于CSV,现在我正尝试使用RooGem将其扩展到XLS、XLSX、ODS和Google电子表格

我希望上传的文件能够根据文件名正确解析。我曾尝试使用regex和switch以及if语句来实现这一点,但到目前为止,还没有成功。问题似乎在正则表达式的条件内,因为即使CSV文件也不再被解析

以下是我目前的版本:

def create
  @deck = Deck.new
  @deck.name = params[:uploadform][:name]
  @deckmsg = ""

  if @deck.save
    @deckmsg='Deck was successfully created.'
  else
    respond_to do |format|
      format.html { render action: "new", notice: 'Deck was not created.' }
    end
  end

  if params[:uploadform][:file] =~ /.*(csv)$/
    begin
      @answers = Array.new
      @questions = Array.new
      CSV.parse(params[:uploadform][:file].read) do |row| 

如果我把If语句取出来,它就工作了,所以问题就在那里。我使用的是普通的上传表单。

您上传的CSV文件是否有大写扩展名
myfile.CSV
与您的正则表达式不匹配。您可以通过告诉它匹配不区分大小写来解决此问题:

/.\.csv$/i
我还删除了多余的括号,并添加了一个显式的
,以便
mycsv
不匹配。您也不需要匹配扩展名之前的所有字符(但可能希望确保至少有一个字符,这样文件就不仅仅名为“.csv”)

而且,
params[:uploadform][:file]
很可能不是您期望的字符串。它可能是一个,在这种情况下,您必须在其上调用
原始文件名
,以获取文件名:

params[:uploadform][:file].original_filename =~ /.\.csv$/i

也许你上传的CSV文件有一个大写的扩展名
myfile.CSV
与您的正则表达式不匹配。您可以通过告诉它匹配不区分大小写来解决此问题:

/.\.csv$/i
我还删除了多余的括号,并添加了一个显式的
,以便
mycsv
不匹配。您也不需要匹配扩展名之前的所有字符(但可能希望确保至少有一个字符,这样文件就不仅仅名为“.csv”)

而且,
params[:uploadform][:file]
很可能不是您期望的字符串。它可能是一个,在这种情况下,您必须在其上调用
原始文件名
,以获取文件名:

params[:uploadform][:file].original_filename =~ /.\.csv$/i

这解决了你的问题吗?别忘了!嗯,不,不幸的是没有。我正在使用一个文件“cities.csv”进行测试,但它仍然无法通过,即使使用改进的regex…@FabianJahr刚刚意识到一些事情,请查看我的更新答案。是的,就是这样!谢谢!这解决了你的问题吗?别忘了!嗯,不,不幸的是没有。我正在使用一个文件“cities.csv”进行测试,但它仍然无法通过,即使使用改进的regex…@FabianJahr刚刚意识到一些事情,请查看我的更新答案。是的,就是这样!谢谢!