简体   繁体   English

在链接中将参数传递给控制器​​的“轨道方式”是什么?

[英]What is the 'rails way' to pass a parameter to the controller in a link

I'm trying to pass a variable from my view to my controller in a link_to. 我正试图通过link_to将视图中的变量传递给我的控制器。 My link_to: 我的link_to:

<%= link_to "Download CSV", vendor_skus_path(format: "csv") %>

I would like to pass an extra filter parameter, but this parameter is set in the view and is not part of a form. 我想传递一个额外的filter参数,但是这个参数是在视图中设置的,不是表单的一部分。 How can I get this parameter to my controller so that I could use it in my model? 如何将此参数提供给我的控制器,以便我可以在我的模型中使用它? How I build the extra filter parameter: 我如何构建额外的过滤器参数:

<%= select_tag "vendor-select", options_from_collection_for_select(@vendors, "id", "name"), include_blank: true, class:"vendor-select form-control" %> 

In my vendor_skus#index controller I do this: 在我的vendor_skus #index控制器中,我这样做:

respond_to do |format|
  format.html
  format.csv { send_data @vendor_skus.to_csv }
end   

What I would like is something like below, so that I can use the extra parameter to filter the rows that are exported. 我想要的是下面的内容,以便我可以使用额外的参数来过滤导出的行。

respond_to do |format|
  format.html
  format.csv { send_data @vendor_skus.to_csv, vendor_id }
end  

A bit late to the party, but hoping this helps someone that may come across something similar. 派对有点晚了,但希望这可以帮助那些可能遇到类似事情的人。 I just came across a similar issue. 我刚刚遇到了类似的问题。 I needed to pass additional filtering parameters to export associated data specific to the record being viewed on the show page. 我需要传递额外的过滤参数来导出特定于显示页面上正在查看的记录的相关数据。

You can pass parameters after the "format: 'CSV'" in your link_to path. 您可以在link_to路径中的“format:'CSV'”之后传递参数。

The following steps should help you achieve your goal. 以下步骤可帮助您实现目标。 Please note that I made assumptions about your setup. 请注意,我对您的设置做了假设。 I'm assuming you have a VENDOR model and each VENDOR has_many :vendor_skus. 我假设你有一个VENDOR模型,每个VENDOR has_many:vendor_skus。 So your 2nd associated model would be VENDOR_SKU which belongs_to :vendor. 因此,您的第二个关联模型将是VENDOR_SKU,其属于:vendor。

1. Create a link which passes parameters that can be used for filtering. 1.创建一个链接,该链接传递可用于过滤的参数。

<%= link_to "Download CSV", vendorskus_export_path(format: "csv", :id => @vendor.id) %> 

The above link_to would look something like this: 上面的link_to看起来像这样:

/ventorskus/export.csv?id=3

2. Create a GET route for the link (/config/routes.rb) 2.为链接创建GET路由(/config/routes.rb)

get '/vendorskus/export', to: 'vendor_skus#export'

3. Create "export" in vendor_skus controller 3.在vendor_skus控制器中创建“导出”

def export
    require 'csv'
    vendor = vendor.find(params[:id])
    @export_metadata = vendor.vendor_skus.all
    respond_to do |format|
      format.html
      format.csv { send_data @export_metadata.to_csv, filename: "Vendor-#{vendor.id}_SKUS_#{Date.today}.csv" }
    end
end

4. Configuring your VENDOR_SKU model (/model/vendor_sku.rb) 4.配置VENDOR_SKU模型(/model/vendor_sku.rb)

class VendorSkus < ApplicationRecord
  #-- Associations --#
  belongs_to :vendor

  #-- Validation Code Here --#
  #-- Scopes Code Here --#
  #-- Custom Code Here --#

  #------------------------------------------------------#
  private
  def self.to_csv
     CSV.generate do |csv|
       csv << column_names
       all.each do |result|
        csv << result.attributes.values_at(*column_names)
       end
     end
  end

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM