3

今日、ファイルのアップロードを含むのに少し問題があります。

最初のいくつかの情報:

Rubyversion:1.9.3p194(2012-04-20リビジョン35410)[x86_64-linux] Railsversion:Rails 3.1.1

必要なコード:マイフォーム

        <%= form_for @label, :html => { :multipart => true } do |f| %>
            <% if @label.errors.any? %>
                    <div id="error_explanation">
                            <h2><%= pluralize(@label.errors.count, "error") %> prohibited this label from being saved:</h2>

                            <ul>
                            <% @label.errors.full_messages.each do |msg| %>
                                    <li><%= msg %></li>
                            <% end %>
                            </ul>
                    </div>
            <% end %>
            <div class="field">
                    <%= f.label :file %><br />
                    <%= f.file_field :file %>
            </div>
            <div class="actions">
                    <%= f.submit %>
            </div>
    <% end %>

私のモデル:

class Label < ActiveRecord::Base
    attr_accessor :file
    attr_reader :file

    def file=(file)
            log = Logger.new(Rails.root.join("log/label.log").to_s)
            log.info "file-Action called"
            path=file.tempfile.to_path.to_s
            filename="labellist.csv"
            dest=Rails.root.join("app/assets/csv/").join(filename).to_s
            FileUtils.cp(path, dest)
            csv=CsvLabelParser.new
            log.info "New Parser initialized!"
            csv.parse_csv(dest)
            log.info "Variables: path: #{path.inspect} <-----> dest: #{dest.inspect}"
    end
end

私のパーサー

class CsvLabelParser
    require 'csv'

    def initialize
            @logger=Logger.new(Rails.root.join("log/parser.log").to_s)
    end

    def logger
            @logger
    end

    def parse_csv(path)
            counter = 0
            read_handle = File.open(path, "rb")
            content = read_handle.read
            self.logger.info "CONTENT: #{content.inspect}"
            read_handle.close

            content.each_line do |line|
                    if counter != 0
                            csv_array=line.split(";")
                            self.logger.info "CSV-Array No. #{counter}: #{csv_array.inspect}"
                            label=Label.new

                            label.labnr=csv_array[10]
                            label.name=csv_array[0]
                            label.firm1=csv_array[3]
                            label.firm2=csv_array[4]
                            label.postal=csv_array[7]
                            label.city=csv_array[8]
                            label.country=csv_array[9]
                            label.street=csv_array[5]
                            label.pob=csv_array[6]
                            label.save
                    end
                    counter += 1
            end
    end

end

コントローラ-ログ

# Logfile created on 2012-06-06 09:49:23 +0200 by logger.rb/31641
Controller-create-method called! => variables: Params: {"utf8"=>"✓", "authenticity_token"=>"L+fpIMqFA9qe9U/LxU+atFONT8e3L5xEUum1321mRng=", "label"=>{"file"=>#<ActionDispatch::Http::UploadedFile:0x00000003df2318 @original_filename="ADRBW076-Q.csv", @content_type="text/csv", @headers="Content-Disposition: form-data; name=\"label[file]\"; filename=\"ADRBW076-Q.csv\"\r\nContent-Type: text/csv\r\n", @tempfile=#<File:/tmp/RackMultipart20120606-2741-1izzofa>>}, "commit"=>"Create Label", "action"=>"create", "controller"=>"labels"}<-----> Label: #<Label id: nil, labnr: nil, name: nil, firm1: nil, firm2: nil, postal: nil, city: nil, country: nil, street: nil, pob: nil, created_at: nil, updated_at: nil>

それで!ご覧のとおり、CSVファイルをアップロードしてデータベースに解析したいと思います。ファイルのコピーは、後で使用できるようにCSVというフォルダーに保存する必要があります。私はそれを約5回行ったことがあり、うまく機能しましたが、今回はモデルのfile-methodが呼び出されていないようです。今のところ、私はそれがこれ以上何も機能しないことを望んでいます。将来、エラーやそのようなものをキャッチするためのいくつかの変更があります;)。毎回呼び出されるコントローラーアクションをログに記録しました。ログファイルがお役に立てば幸いです。他のログファイルと比較すると、私には問題ないように見えます。私は解決策を探しましたが、すべてが私には大丈夫に見えます(たぶん私は:または、を忘れただけです)ので、私は本当に何が悪いのかを言うことができません!

ご協力いただきありがとうございます

4

1 に答える 1

1

私は解決策を持っています!

Rails3.1.1とRuby1.9.3を使用していますが、これはgemsetです。問題は、新機能「attr_accessible」でした。通常、Rails 3.1.1では使用されません。新しいgemsetにより、:file-Fieldにアクセスできるようにする必要がありました。したがって、ソリューションは単純です。追加する必要があります。

attr_accessible :file, ect

私のモデルのトップに、そしてすべてがうまくいきました!

于 2012-06-14T09:10:31.467 に答える