如何将长数组传递到另一个页面?

时间:2017-06-26 02:57:14

标签: ruby-on-rails ruby parameters parameter-passing uri

我有一个用于上传excel文件的表单,以及一个使用Roo解析所述文件的方法。我想要发生的是:用户上传excel文件,并被重定向到列出文件的前十行的页面。

我可以获得前十行,但我无法弄清楚如何让它们超越第一种方法。我尝试将它们包含在params中,但是我得到了一个" Request-URI Too Large"错误,不出所料。这就是我到目前为止所做的:

def upload_file
  # View with form. User adds file, which is uploaded under "file" params.
end

def process_file
  file_path = params[:file].path
  @lines = Roo::Excelx.new(file_path).first(10).to_a # Returns array of first ten lines of file
  ? # Somehow save value of @lines for "view_lines" method
  redirect_to view_lines_path
end

def view_lines
  @lines = ? # I want to use the "@lines" array from the previous method here.
  ...

所以要清楚,我想从@lines方法获取process_file值(十个数组的数组),并将其传递给view_lines方法。但它太大了,无法通过params。我是否必须使用ajax?

3 个答案:

答案 0 :(得分:4)

在定义view_lines方法时,您似乎只需要使用参数:

def process_file
  file_path = params[:file].path
  lines = Roo::Excelx.new(file_path).first(10).to_a # Returns array of first ten lines of file
  view_lines(lines)
  ...   
end

def view_lines(lines)
  # Use `lines` here
  lines.each do |line|
    # Use `line` here for each individual line
    ...
  end
end

您也可以查看Variable Scope and Visibility。与其他语言(如Perl和shell脚本)不同,@ sigil不表示数组,而是表示instance variable

听起来您还有另一个问题,即尝试形成一个过长的网址。如果您通过HTTP传递大量数据,请考虑使用POST request

答案 1 :(得分:4)

您可以通过多种方式完成此操作,下面列出了两种方式。

首先,存储您的session in table。 然后,您可以在会话中设置@lines并在下一个请求中使用该会话。

sessions['lines'] = @lines

第二种方式,如果URL对您的应用程序不重要。然后,您可以使用render redirect的{​​{1}}实例直接代表最后10行。

def process_file
  file_path = params[:file].path
  @lines = Roo::Excelx.new(file_path).first(10).to_a # Returns array of first ten lines of file
  ? # Somehow save value of @lines for "view_lines" method
  render '/path/to/view'
end

答案 2 :(得分:1)

看起来您不想传递给某个方法但想要传递给某个操作。只需将其作为后期操作而不是获取。 Post会处理那么多数据。

由于