0
からコントローラのアクションを実行して、私が必要とするほぼすべてのコードは、コントローラのアクションであり、私は代わりにそのコントローラのアクションを呼び出すしたいと思います私の仕事に「同じ」コードを書いて、いくつかのコード行を節約してください。それは可能ですか?レール:私は、私のRailsアプリでタスクを自動化するrakeタスクを作成したいコード
からコントローラのアクションを実行して、私が必要とするほぼすべてのコードは、コントローラのアクションであり、私は代わりにそのコントローラのアクションを呼び出すしたいと思います私の仕事に「同じ」コードを書いて、いくつかのコード行を節約してください。それは可能ですか?レール:私は、私のRailsアプリでタスクを自動化するrakeタスクを作成したいコード
まあ、例えば。あなたは、両方の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
これは私があなたの問題を解決するための良い方法を考えるものです。あなたは私の考えが欲しいと思います。悪いデザインです:)
はありません。正しい方法は、ポロのクラスを作成し、両方など、あなたがDRYを接着している。この方法でコントローラとのRakeタスクのロジックを実行するために、そのクラスを使用することです。 –
あなたが知っているリンクやリソースがあれば、答えに追加してください。私はあなたの答えを受け入れてくれます。ありがとうございます=) – SsouLlesS