2017-02-17 3 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 

감사합니다! 를 호출 한 후

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'}) 

당신이 추출 할 수 있도록 그 방법은 컨트롤러에 속하는하지 않는 것

답변

0

당신은 하나 하나에 당신의 방법을 모두 리팩토링 할 수있다 그것은 어딘가에있다. this great article을 확인하고 새로운 서비스 개체로 메서드를 추출하는 것이 좋습니다.

+0

그래, 그건 유일한 차이점 인 것처럼 보입니다. –

+0

멋지다. 고마워! 내 sales_controller.rb에서 직접 가져 오기 방법을 정의하겠습니까? 그리고 이것을 이렇게 부릅니까? '데프 수입 import_csv_test ({파일 : PARAMS [: 파일]}) 끝 ' – AakLak

+0

그래, 당신이 할 수 있습니다. 메서드가 컨트롤러에 있어야하는 것은 아닙니다. 그래서 다른 곳에서 추출해야 할 것입니다. 가장 좋은 선택은 하나의 public 메소드'call' (정확히'import' 메소드와 동일)를 가진 Service Class와 필요할 경우 여러 개인 메소드가 될 것입니다. 따라서 컨트롤러에서 해당 서비스의 인스턴스를 만들고 호출 메소드를 호출 할 수 있습니다. 나는 당신을위한 유용한 링크로 나의 대답을 편집 할 것이다. – 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에서 매개 변수를 필터링 할 수 있습니다.