【问题标题】:Ruby on Rails: read user submited .txt file into variableRuby on Rails:将用户提交的 .text 文件读入变量
【发布时间】:2015-04-09 10:52:03
【问题描述】:

我正在构建一个 ruby​​ on rails 应用程序,它允许用户从他们的硬盘驱动器中选择一个文件,然后将文本文件中的特定行写入数据库。表格已经建好了,但是现在不知道怎么把文件的内容变成变量,格式化再写入数据库。

我有一个名为drafts 的数据库表,列有set_1、set_2、set_3。我想将第 13 行(来自文本文件)写入 set_1,将第 165 行写入 set_2,将第 317 行写入 set_3。我还想在编写这些行之前对其进行格式化。在文件中,它们看起来像这样------ FRF ------,而我只想要FRF

我花了很多时间搜索 stackoverflow 和 ruby​​onrails 指南,但很难弄清楚这一点。总的来说,我对 ruby​​ 和 rails 很陌生,因此我们非常感谢您的帮助。

这是我的控制器 (drafts_controller.rb):

class DraftsController < ApplicationController
    def new
        @page_title = "Upload MTGO Draft"

        @draft = Draft.new
    end

    def create
        @draft = Draft.new(draft_params)
        if @draft.save
            flash[:notice] = "Draft Saved!"
            redirect_to drafts_show_path
        else
            render "new"
        end
    end

    def index
        @page_title = "MTGO Draft"
    end

    def show
        @page_title = "MTGO Draft Replayer"
    end 

    def search
        @page_title = "Search MTGO Draft"
    end

    def destroy

    end

    def draft_params
        params.require(:draft).permit(:name, :set_1, :set_2, :set3, :file_setter)
    end
end

和我的观点:(new.html.erb):

<%= form_for @draft, :multipart => true do |f| %>
    <div class="form-group">
        Draft Log: <%= f.file_field :file_setter %>
        <%= f.submit 'Save' %>
    </div>
<% end %>

这是模型(draft.rb)

class Draft < ActiveRecord::Base
    def file_setter=(file)
        path = file.tempfile.to_path.to_s
        lines = File.read(path).split("\r\n")
        self.set_1 = lines[12]
        self.set_2 = lines[164]
        self.set_3 = lines[316]
    end
    attr_accessor :file_setter
end

如果您需要更多信息或想深入了解整个应用程序,他是gitHub repository

感谢您的帮助。

这是日志摘录:

Started POST "/drafts" for 127.0.0.1 at 2015-04-10 10:52:57 +0200
Processing by DraftsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"8IjtOXuXm3fswWTslDTq5ijjo0dpCWHlu9X7UFb5prvawrZfkLC46v7PbqTgrSrvukLxAAoBIBftsGqiXv79JA==", "draft"=>{"file_setter"=>#<ActionDispatch::Http::UploadedFile:0x00000005ee4a08 @tempfile=#<Tempfile:/tmp/RackMultipart20150410-3067-1fssm13>, @original_filename="1", @content_type="application/octet-stream", @headers="Content-Disposition: form-data; name=\"draft[file_setter]\"; filename=\"1\"\r\nContent-Type: application/octet-stream\r\n">}, "commit"=>"Save"}
  [1m[36m (0.2ms)[0m  [1mBEGIN[0m
  [1m[35mSQL (1.8ms)[0m  INSERT INTO `drafts` (`created_at`, `updated_at`) VALUES ('2015-04-10 08:52:57', '2015-04-10 08:52:57')
  [1m[36m (41.6ms)[0m  [1mCOMMIT[0m
Redirected to http://localhost:3000/drafts/show
Completed 302 Found in 57ms (ActiveRecord: 43.6ms)

【问题讨论】:

  • 你的主要问题是从文本文件中读取内容吗?
  • 我的主要问题是读取内容并将其存储在一个变量中(最好是每行一个元素的数组),这样我就可以对其进行格式化,然后将其写入数据库。格式化和写入其次,现在我只想打开文件。
  • path = file.tempfile.to_path.to_s 是否为您提供了正确的路径?
  • 对不起,我不知道如何检查。我想要做的是让用户从他的硬盘输入一个文件,所以这应该是通用的?
  • 您可以使用file.tempfile.read从文件中获取文本内容。之后,您可以通过'\t\n' 拆分内容

标签: ruby-on-rails ruby forms


【解决方案1】:

将此方法添加到您的模型中:

def file_setter=(file)
  path = file.tempfile.to_path.to_s
  lines = File.read(path).split("\r\n")
  self.set_1 = lines[12]
  self.set_2 = lines[164]
  self.set_3 = lines[316]
end

在您的表单中,将 file_field 值从 :file 更改为 :file_setter,如下所示:

<%= form_for @draft, :multipart => true do |f| %>
    <div class="form-group">
        Draft Log: <%= f.file_field :file_setter %>
    </div>
<% end %>

// 将:multipart =&gt; true 添加到form_for 方法非常重要。否则无法上传文件。

// 也将其添加到您的模型中:

attr_accessor :file_setter

// 在你的控制器中你必须改变这个:

def draft_params
  params.require(:draft).permit(:name, :set_1, :set_2, :set3)
end

到这里:

def draft_params
  params.require(:draft).permit(:name, :set_1, :set_2, :set3, :file_setter)
end

【讨论】:

  • 还要确保你允许在你的控制器中设置file_setter!!!如果你不将它添加到强参数中,甚至不会调用该方法
  • 请发布您从日志文件生成的呼叫。我需要查看参数哈希
  • 对不起,这个在linux上打开很好,然后我在windows的记事本中打开它,发现格式化消失了,很快就会修复
  • 没关系,它只是记事本的一个问题,它只将 \r\n 解释为换行符,而不仅仅是 \n 像 vi(m)、emacs、joe、...阅读它。
  • 看起来还不错,file_getter 是作为文件上传传输的,而不是我预期的文本。请在此处发布您的模型代码(不要上传,将其编辑到您的帖子中)并发布您的视图代码。
猜你喜欢
  • 1970-01-01
  • 2017-01-26
  • 2015-01-10
  • 1970-01-01
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多