Ruby on rails 将数据发布到另一个控制器的正确方法是什么;什么行动?
我有一个自定义Rails表单,如下所示:Ruby on rails 将数据发布到另一个控制器的正确方法是什么;什么行动?,ruby-on-rails,parameters,controller,Ruby On Rails,Parameters,Controller,我有一个自定义Rails表单,如下所示: <form action="/download/zip" id="multifile" method=POST> <!-- Here is a react component that makes a loop of every record I have of uploaded files, with a checkbox before each of them, that would look like the followin
<form action="/download/zip" id="multifile" method=POST>
<!-- Here is a react component that makes a loop of every record I have of uploaded files, with a checkbox before each of them, that would look like the following -->
<label><input type="checkbox" value={ this.props.file.path } /> { this.props.file.filename } </label>
<input type="submit" value="Download" />
</form>
{this.props.file.filename}
我选择不使用表单,因为我要提交的值没有链接到模型(但如果需要,我可以使用它)
外部控制器在这里创建每个选定文件的zip。如果我将该方法修改为“get”,并且要求下载所有内容,那么它就可以工作
到目前为止,情况如下:
class DownloadController < ApplicationController
require 'zip'
def zip
abort @params.inspect # returns 'nil'
zip_tmp = File.new("#{Rails.root}/public/zip-#{Time.now.strftime('%d%m%Y')}.zip", 'w+')
Zip::File.open(zip_tmp.path, Zip::File::CREATE) do |zipfile|
FileDetail.all.each do |file| # This works with route set to get
zipfile.add(file.path.split('/')[-1], '/home/username/DEV/rails-react-project/public' + file.path)
end
end
send_file "#{Rails.root}/public/zip-#{Time.now.strftime('%d%m%Y')}.zip"
end
private
def params
@params
end
end
类下载控制器
我正确地被重定向到控制器,但是当我检查是否有一些数据要处理时,我得到了零
这样做的“正确”方式是什么
先谢谢你
(顺便说一句,我知道如果这个实际代码有效,我会遇到一些问题,但是通过参数获取数据会很好地开始)我看到它已经对错误进行了注释,但我想编辑您的代码并作为答案发布,因为这对其他人很有帮助 表格:
<form action="/download/zip" id="multifile" method=POST>
<!-- Here is a react component that makes a loop of every record I have of uploaded files, with a checkbox before each of them, that would look like the following -->
<label>
<input type="checkbox" name="my_param_name[]" value={ this.props.file.path } /> { this.props.file.filename }
</label>
<input type="submit" value="Download" />
</form>
{this.props.file.filename}
控制器:
class DownloadController < ApplicationController
require 'zip'
def zip
# This will return array of files user has selected in form
# You can use this to process further to generate zip
files_list = params[:my_param_name]
suffix = Time.now.strftime('%d%m%Y')
zip_file_name = "#{Rails.root}/public/zip-#{suffix}.zip"
zip_tmp = File.new(zip_file_name, 'w+')
Zip::File.open(zip_tmp.path, Zip::File::CREATE) do |zipfile|
FileDetail.all.each do |file| # This works with route set to get
zipfile.add(file.path.split('/')[-1], '/home/username/DEV/rails-react-project/public' + file.path)
end
end
send_file zip_file_name
end
end
类下载控制器
注意:我没有在本地测试代码,所以可能会出现错误。若你们面临错误,对答案进行评论
希望这有帮助 直接调用
params.inspect
并删除params
方法params.inspect
会给出相同的结果您是否也删除了'def params'方法?您必须查看您的表单,如果每个输入都有正确的名称
,这就是为什么POST
ed发送给控制器的原因……好吧,我相信这是问题的根源,我忘了在复选框上写上名字,谢谢你的提示谢谢你(谢谢@Iceman)这就是问题所在,这是一个noob问题,但我能够在提交表格后获得我的参数!