使用带有数组路由问题的will_paginate

时间:2018-03-15 15:42:39

标签: ruby routes ruby-on-rails-5 will-paginate

我的项目目前配置为只有一个视图import.html,允许用户上传和查看CSV文件的内容(上传后)。

这是控制器类导入方法:

class UploadController < ApplicationController
  require "CSV"
  require 'will_paginate/array'
  def import
    return if params[:file] == nil
    file = params[:file]
    @table = []
    rowi = 0

    CSV.foreach(file.path) do |row|
      if rowi == 0 #and headers (for later)
        @headers = row
      else
        @table << row.join("~")
      end
      rowi = rowi + 1
    end

    @table = @table.paginate(page: params[:page], :per_page => 20)
    session
  end
end

以下是观点:

<h1>Upload#import</h1>

<h4>UPLOAD A CSV FILE:</h4>

<%= form_tag({:action => "import"}, multipart: true) do %>
  <%= file_field_tag :file %>
  <%= submit_tag( "Import" ) %>
<% end %>

<% if @headers and @table %>
  <h1>RESULTS</h1>
  <table>
    <thead>
      <tr>
        <% @headers.each do |column| %>
          <td><%= column  %></td>
        <% end %>
      </tr>
    </thead>
    <tbody>
      <% @table.each do |row| %>
        <tr>
          <% row.split("~").each do |cell| %>
            <td><%= cell %></td>
          <% end %>
        </tr>
      <% end %>
    </tbody>
  </table>
  <%= will_paginate @table, inner_window: 1, outer_window: 0%>
<% end %>

以下是路线:

Rails.application.routes.draw do
  root 'upload#import'
  post "/" => "upload#import"
end

当与我的桌子交互以转到另一页时,我的路线没有指定的指令:

  

获取“/?page =(pagenumber)”

我不知道要告诉它要做什么才能显示正确的页面。

它只是默认重定向到import_page,它会清除已导入的所有数据。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

简而言之,您可能希望使用singular resource来实现此目的。

所以你需要以下内容:

routes.rb

resource :uploader, only: [:show, :create]

(N.B。这是与更常见的resources 复数不同的用例。)

这将为您提供以下路线:

POST    /upload uploads#create  # create the new upload
GET     /upload uploads#show    # display the one and only upload resource

在您的控制器中:

class UploadController < ApplicationController
  require "csv"
  require 'will_paginate/array'

  def create
    return if params[:file] == nil
    file = params[:file]
    @table = []
    rowi = 0

    CSV.foreach(file.path) do |row|
      if rowi == 0 #and headers (for later)
        @headers = row
      else
        @table << row.join("~")
      end
      rowi = rowi + 1
    end

    # save the file to the db
    # redirect to upload_path
  end

  def show   
    # Find the relevant table 
    @table = Table.last.paginate(page: params[:page], :per_page => 20)
  end
end

然后您需要在视图中修改表单以使用@table,例如:

...
<%= form_for @table, multipart: true) do %>
  <%= f.file_field :file %>
  <%= f.submit  "Import" %>
<% end %>
...

这是您的项目应如何运作的基本摘要。它的关键是使用正确的单独动作来创建和显示表格。

您可能希望查看使用strong params和其他Rails约定。

最后,如果有帮助,请查看生成的Rails控制器(即rails generate controller my_example_controller) - 这将预先构建createshow个动作,您可以查看将代码合并到类似的东西中。

希望这有帮助 - 如果您有任何问题,请给我一个喊叫。