テキストファイルをアップロードしてから、そのファイル名、content_type、およびデータをDBテーブルに保存するアプリがあります。
これはすべてうまく機能しますが、ファイルを単語に分割し、単語を文字に分割し、アルファベット順に並べ替えてから再度結合するメソッドを作成しようとしています。その間、並べ替えられた文字をキーとしてハッシュに入力します。文字が値として表す単語で。
"denoops"=>[" snooped", "spooned"]
これは小さいファイルでは機能しますが、300,000語程度の大きいファイルを解析すると、すべてのデータがハッシュに入力されますが、次のエラーでエラーが発生します。
expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS
これがコードです。注更新データをハッシュとしてデータベースに保存するシリアル化を追加し、列タイプをバイナリからテキストに変更しました。
attachment.rb:
class Attachment < ActiveRecord::Base
has_many :anagrams, dependent: :destroy
attr_accessible :filename, :content_type, :data
validates_presence_of :filename, :data
serialize :data, Hash
def uploaded_file=(incoming_file)
self.filename = incoming_file.original_filename
self.content_type = incoming_file.content_type
results = {}
incoming_file.read.downcase.split.each do |word|
letters = word.split('').sort
results[letters.join] = [[results[letters]].join(" ")] << word
end
self.data = results
end
Railsエラーログ:
Started POST "/attachments" for 127.0.0.1 at 2012-08-20 17:10:09 +0100
Processing by AttachmentsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"y2S3Z6Yg9iuU74to7ZEDUedlCEsazEU26mIrsnNxgmQ=", "attachment"=>#<ActionDispatch::Http::UploadedFile:0x007f8a411497b8 @original_filename="medium_word_list.90", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"attachment\"; filename=\"medium_word_list.90\"\r\nContent-Type: application/octet-stream\r\n", @tempfile=#<File:/var/folders/1g/d9qbm7_s0_5fcljtvzysp1gc0000gn/T/RackMultipart20120820-3535-119x9hk>>, "commit"=>"upload"}
(0.1ms) begin transaction
(0.1ms) rollback transaction
Completed 500 Internal Server Error in 11177ms
RuntimeError (expected SCALAR, SEQUENCE-START, MAPPING-START, or ALIAS):
app/controllers/attachments_controller.rb:21:in `create'
添付ファイルテーブルの移行を作成します。
class CreateAttachments < ActiveRecord::Migration
def up
create_table :attachments do |t|
t.string :filename
t.string :content_type
t.text :data
end
end
Googleからはあまりありません。誰かがもっとコードが必要な場合は、ただ言ってください。