Ruby on 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

我有一个自定义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 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问题,但我能够在提交表格后获得我的参数!