2014-08-28 39 views
0

我正在构建一个市场应用程序,以便卖家可以列出要销售的物品。我正在尝试下载卖家的CSV文件,以便卖家可以下载他们自己的物品。Rails 4 download to CSV

我正在关注此railscast中的代码。我得到了railscasts代码,按原样工作。它将我模型中的所有数据下载到csv中。但是,当我向查询添加卖家过滤器时,它不应用过滤器。

在listings_controller:

def index 
    @listings = Listing.not_expired.order("created_at DESC") 
    respond_to do |format| 
     format.html 
     format.csv { send_data @listings.to_csv } 
    end 
end 

def seller 
    @listings = Listing.where(user: current_user).order("created_at DESC") 
    respond_to do |format| 
    format.html 
    format.csv { send_data @listings.seller_csv } 
    end 
end 

在listing.rb:

def self.to_csv 
    CSV.generate do |csv| 
    csv << column_names 
    all.each do |listing| 
     csv << listing.attributes.values_at(*column_names) 
    end 
    end 
end 

def self.seller_csv 
    CSV.generate do |csv| 
    csv << column_names 
    where(user: current_user).each do |listing| 
     csv << listing.attributes.values_at(*column_names) 
    end 
    end 
end 

的to_csv方法工作正常,下载的所有目录。但seller_csv方法也会下载所有列表。我需要它通过current_user进行过滤。我错过了什么?

回答

2

让你的函数以列表的形式作为参数。

def self.to_csv(listings) 
    CSV.generate do |csv| 
    csv << column_names 
    listings.each do |listing| 
     csv << listing.attributes.values_at(*column_names) 
    end 
    end 
end 

然后你甘蔗重新使用在两种情况下相同的功能

def index 
    @listings = Listing.not_expired.order("created_at DESC") 
    respond_to do |format| 
     format.html 
     format.csv { send_data Listing.to_csv(@listings) } 
    end 
end 

def seller 
    @listings = Listing.where(user: current_user).order("created_at DESC") 
    respond_to do |format| 
    format.html 
    format.csv { send_data Listing.to_csv(@listings) } 
    end 
end 

您的代码没有做真正的意义,因为你在获取你的控制器列表而且永不再使用那些牵强对象,并在模型的静态函数中重新调用DB。