2016-08-01 5 views
0

からコントローラのアクションを実行して、私が必要とするほぼすべてのコードは、コントローラのアクションであり、私は代わりにそのコントローラのアクションを呼び出すしたいと思います私の仕事に「同じ」コードを書いて、いくつかのコード行を節約してください。それは可能ですか?レール:私は、私のRailsアプリでタスクを自動化するrakeタスクを作成したいコード

+1

はありません。正しい方法は、ポロのクラスを作成し、両方など、あなたがDRYを接着している。この方法でコントローラとのRakeタスクのロジックを実行するために、そのクラスを使用することです。 –

+0

あなたが知っているリンクやリソースがあれば、答えに追加してください。私はあなたの答えを受け入れてくれます。ありがとうございます=) – SsouLlesS

答えて

0

まあ、例えば。あなたは、両方のRakeタスクからストライプ顧客のサブスクリプションを更新し、クライアント側を使用してautoにユースケースがあるとします。さて、あなたは以下のようなポロクラスを作成します:

class AutoRenewSubscription 
    attr_reader :coupon, :email 

    def initialize args = {} 
    @email = args[:email] 
    @coupon = args[:coupon] 
    #.... 
    end 

    def run! 
    user_current_plan.toggle!(:auto_renew) 

    case action 
    when :resume 
     resume_subscription 
    when :cancel 
     cancel_subscription 
    end 
    end 
    #... some more code as you need. 
end 

あなたはapp/services/auto_renew_subscription.rbフォルダ内のクラスを置くことができます。現在、このクラスは世界中で利用可能です。だから、のようなコントローラ内部でそれを呼び出す:

class SubscriptionController < ApplicationController 
    def create 
    #.. some logic 
    AutoRenewSubscription.new(
    coupon: "VXTYRE", email: '[email protected]' 
    ).run! 
    end 
end 

そしてまたあなたのrakeタスクからそれを呼び出すん:

desc "This task is to auto renew user subscriptions" 
task :auto_renew => :environment do 
    puts "auto renew." 
    AutoRenewSubscription.new(
    coupon: "VXTYRE", email: '[email protected]' 
).run! 
end 

これは私があなたの問題を解決するための良い方法を考えるものです。あなたは私の考えが欲しいと思います。悪いデザインです:)

関連する問題