非常に似たコードを持つコントローラーには2つのメソッドがあります。どのように私はそれらを乾燥させることができますか?彼らは両方とも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
ありがとう!あなたが単一のものにあなたの方法の両方をリファクタリングする
これは唯一の違いだと思われます。 –
これは素晴らしいですね、ありがとう! 私のsales_controller.rbに直接インポートメソッドを定義しますか? これをこのように呼びますか? 'DEF import_csv_test インポート({ファイル:のparams [:ファイル]}) 終了 ' – AakLak
うん、あなたはそれを行うことができます。メソッドがあなたのコントローラーに存在するはずはありません。だから、あなたはたぶんどこかでそれを抽出する必要があるでしょう。大きな選択肢は、単一のパブリックメソッド 'call'(' import'メソッドと全く同じ)といくつかのプライベートメソッドが必要な場合は、サービスクラスです。そのため、あなたのコントローラーでは、そのサービスのインスタンスを作成し、 'call'メソッドを呼び出すことができます。私はあなたのためのいくつかの便利なリンクで私の答えを編集します。 – VAD