Rails 3服务器启动问题与fastercsv

5
我有一个使用Rails 2.3.5开发的应用程序,现在需要升级到Rails 3。我已经完成了所有必要的升级工作,但当我使用命令启动Rails服务器时,出现了问题。
rails server

它给了我这个。
Please switch to Ruby 1.9's standard CSV library.  It's FasterCSV plus
support for Ruby 1.9's m17n encoding engine.

我正在使用 ruby-1.9.2-p0,并安装了 fastercsv (1.5.3) gem。通过使用 puts 语句,我能够追踪错误发生的位置。我发现执行停在这一行。
Bundler.require(:default, Rails.env) if defined?(Bundler)

在application.rb文件中。我尝试了很多方法,但都没有成功..请帮忙..
5个回答

7

在应用程序的Gemfile中删除fasterCSV。Bundler试图要求FasterCSV,因为您在Gemfile中指定了它。


我得到了这个错误 application.rb:54:in `require': 没有找到文件 -- fastercsv (LoadError)。 - Anand
实际上,我在application.rb中有一组require语句,用于应用程序中使用的gems,其中第54行是require 'fastercsv'。 - Anand
你不应该像那样在application.rb中放置gems的requires。使用bundler来配置项目所需的所有gems,因为这是将gems包含在项目中的新方法。 - davydotcom
现在看起来,fastercsv已经成为了Ruby 1.9的标准,你甚至可能不需要require fastercsv或将其包含为gem。 - davydotcom
在Bundler里面吗?是的。Bundler.require函数实际上是设计为遍历Gemfile中的宝石列表并将它们引入到您的项目中。 - davydotcom

7

在1.9版本中,您不再需要/无法使用更快的csv gem,因为它已经捆绑在标准库中。 现在您只需要执行以下操作:

require 'csv'
CSV.open("temp.csv", "w") do |csv|
  csv << ["line1row1", "line1row2"]
  csv << ["line2row1", "line2row2"]
  # ...
end

const_missing':请切换到Ruby 1.9的标准CSV库。它是FasterCSV加上对Ruby 1.9的m17n编码引擎的支持。(NotImplementedError) - carl crott

2
这是我找到的解决方案:
require 'fastercsv'
require 'csv'

class ImportFileToAssetsWithFasterCsv < ActiveRecord::Migration
  def self.up
    if CSV.const_defined? :Reader
    csv = FasterCSV
    else
    csv = CSV
    end

    file = 'db/staticfiles/DB-good-rightnames-forimport.csv'
    csv.foreach(file) do |row|
      Asset.create!(:country => row[0], :city => row[1], :latlong => row[2], :XX => row[3], :DEC => row[4], :point_name => row[5], :system_type => row[6], :system_brand => row[7], :function => row[8], :operator_name => row[9], :operator_brand => row[10], :parent_company => row[11], :app => "WWW", :language => "en", :source => "XXX", :Z_name => "International", :pref_format => "")
    end
  end

  def self.down
    IspcAsset.destroy_all()
  end
end

1
如果在循环中使用了FasterCsv,或者在代码中使用了它,只需将其更改为Csv即可。 从gem文件中删除gem 'fastercsv'。 只需在控制器中编写您的代码,无需在配置中添加其他代码。
这是错误代码的示例。
class HomeController < ApplicationController
    require 'fastercsv'


def download_csv
    @invitation = Invitation.find(params[:id])
    @activities = Version.where("created_at >= ?", @invitation.created_at)
    if params[:export]

      csv_string = FasterCSV.generate do |csv|
      # header row
            csv << ["Date", "Event", "Details"]

            @activities.each do |act|
              csv << [act.created_at.strftime("%d-%m-%Y"), act.event, act.item_id]

            end
      end   
        timestamp = Time.now.strftime('%Y-%m-%d_%H:%M:%S')
        send_data csv_string,
            :type => 'text/csv; charset=iso-8859-1; header=present',
            :disposition => "attachment; filename=goal_history_#{timestamp}.csv"
    end
  end

刚刚更改了 FasterCsv 为 Csv,现在它可以正常工作了。代码如下:

class HomeController < ApplicationController
    require 'csv'


def download_csv
    @invitation = Invitation.find(params[:id])
    @activities = Version.where("created_at >= ?", @invitation.created_at)
    if params[:export]

      csv_string = CSV.generate do |csv|
      # header row
            csv << ["Date", "Event", "Details"]

            @activities.each do |act|
              csv << [act.created_at.strftime("%d-%m-%Y"), act.event, act.item_id]

            end
      end   
        timestamp = Time.now.strftime('%Y-%m-%d_%H:%M:%S')
        send_data csv_string,
            :type => 'text/csv; charset=iso-8859-1; header=present',
            :disposition => "attachment; filename=goal_history_#{timestamp}.csv"
    end
  end


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接