2017-02-17 49 views
1

我在控制器中有兩種非常類似代碼的方法。想知道我該如何幹掉它們!他們都使用csv-importer gem來解析csv文件。在控制器方法中烘乾類似的代碼

sales_controller.rb

def import_csv_test 
    user_id = params[:user_id] 
    import = ImportSaleCSV.new(file: params[:file]) do 
     after_build do |sale| 
     sale.user_id = user_id 
     skip! if sale.email == nil 
     skip! if sale.order_date == nil 
     skip! if sale.amount == nil 
     end 
    end 
    import.run! 
    redirect_to lifecycle_grid_sales_path, notice: import.report.message 
    end 

    def import_ftp 
    user_id = params[:user_id] 
    import = ImportSaleCSV.new(path: './public/uploads/gotcha.csv') do 
     after_build do |sale| 
     sale.user_id = user_id 
     skip! if sale.email == nil 
     skip! if sale.order_date == nil 
     skip! if sale.amount == nil 
     end 
    end 
    import.run! 
    redirect_to lifecycle_grid_sales_path, notice: import.report.message 
    end 

謝謝!

回答

0

你可能既重構你的方法爲單一個:

def import(hash) 
    user_id = params[:user_id] 
    import = ImportSaleCSV.new(hash) do 
    after_build do |sale| 
     sale.user_id = user_id 
     skip! if sale.email == nil 
     skip! if sale.order_date == nil 
     skip! if sale.amount == nil 
    end 
    end 
    import.run! 
    redirect_to lifecycle_grid_sales_path, notice: import.report.message 
end 

然後調用它:

import({file: params[:file]}) 
import({path: './public/uploads/gotcha.csv'}) 

它似乎並不該方法屬於您的控制器,所以你可能要提取它在某個地方。我鼓勵您檢查this great article並將您的方法提取到全新的服務對象中。

+0

是的,這似乎是唯一的區別。 –

+0

這看起來不錯,謝謝! 我會直接在我的sales_controller.rb中定義導入方法嗎? 而且這樣稱呼它? '高清import_csv_test 進口({文件:PARAMS [:文件]}) 結束 ' – AakLak

+0

呀,你能做到這一點。似乎這種方法不應該存在於你的控制器中。所以你可能需要將它解壓到別的地方。最好的選擇是使用單個公共方法'call'的服務類(與'import'方法完全相同)以及若干需要的私有方法。因此,在您的控制器中,您將能夠創建該服務的實例並調用它的「調用」方法。我會用一些有用的鏈接編輯我的答案給你。 – VAD

0

我認爲你可以提取一個類來完成繁重的工作。

class ImportSaleCSVCreator 
    def initialize(csv_options = {}, csv_attributes = {}) 
    @csv_options = csv_options 
    @csv_attributes = csv_attributes 
    end 

    def build 
    ImportSaleCSV.new(csv_options) do 
     after_build do |sale| 
     csv_attributes.each { |k, v| sale.public_send("#{k}=", v) } 
     skip! if sale.email.nil? || sale.order_date.nil? || sale.amount.nil? 
     end 
    end 
    end 

    private 

    attr_reader :csv_options, :csv_attributes 
end 

class Controller 
    def import_csv 
    import = ImportSaleCSVCreator.new({ file: params[:file] }, { user_id: params[:user_id] }) 
    import.run! 
    end 

    def import_ftp 
    import = ImportSaleCSVCreator.new({ path: './gotcha.csv' }, { user_id: params[:user_id] }) 
    import.run! 
    end 
end 

請確保您檢查傳遞的屬性。特別是在處理文件,路徑等時,您可能需要過濾ImportSaleCSVCreator中的參數。