我有一个用于上传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?
答案 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会处理那么多数据。
由于