2017-02-16 7 views
0

は、私が購入、特定の日付属性を持って提供し、購入からイベントを作成し、rakeタスクを持っています。rakeタスクは、コントローラの「作成」メソッドを使用することはできますか?

rakeタスクのコードは次のとおりです。私は熊手を実行すると

namespace :events do 

    desc "Create events from purchases." 
    task purchases: :environment do 

    purchases = Purchase.all 

    purchases.each do |purchase| 
     begin 
     ## SUMMARY VARIABLE 
     vendor = purchase.vendor.name 
     order_number = purchase.order_number 
     est_ship_date = purchase.estimated_ship_date 
     purchase_summary = "Est. ship date: #{est_ship_date} #{vendor} PO ##{order_number}" 

     ## DESCRIPTION VARIABLE 
     tradegecko_url = purchase.tradegecko_url 
     description = "#{vendor} PO ##{order_number} Estimated ship date: #{est_ship_date}. #{tradegecko_url}" 

     ## START_DATE VARIABLE 
     start_date = purchase.estimated_ship_date 

     ##END_DATE VARIABLE 
     end_date = start_date 

     unless purchase.estimated_ship_date == nil 
      event = Event.find_or_initialize_by(summary: purchase_summary) 
      event.update_attributes(
      summary: purchase_summary, 
      description: description, 
      start_date: start_date, 
      end_date: end_date 
      ) 
      pp purchase 
     end 
     rescue NoMethodError => e 
     puts "#{e.inspect} #{purchase.inspect}" 
     end 
    end 
    end 

、イベントは私が持っている私のイベントにコントローラが「作成」メソッドを除いて、正常に動作するようです私のイベントテーブルに作成されます私のGoogleカレンダーにイベントをプッシュ「@ event.save場合」コールは、その後、新たに作成されたGoogleカレンダーのイベントからEVENT_IDをつかみ、自分のデータベースに保存します。これは、私が手作業で新しいイベントを作成したが、新しいイベントがレーキから作成されたときには完全に機能しません。

events_controller.rb「作成」方法:

def create 
    @event = Event.new(event_params) 

    respond_to do |format| 
     if @event.save 
     format.html { redirect_to @event, notice: 'Event successfully created.' } 
     format.js {} 
     format.json { render json: @event, status: :created, location: @event } 
     else 
     format.html { render 'new' } 
     format.json { render json: @event.errors, status: :unprocessable_entity } 
     end 
    end 

    if @event.save 

     gcal_event = Google::Apis::CalendarV3::Event.new({ 
     summary: @event.summary, 
     description: @event.description, 
     start: { 
      date: @event.start_date 
     }, 
     end: { 
      date: @event.end_date 
     } 
     }) 

     @cal_service = GoogleCalendarService.new 
     @cal = @cal_service.calendar 

     result = @cal.insert_event(GoogleCalendarService::CALENDAR_ID, gcal_event) 

     @event.calendar_event_id = result.id 
     @event.save 
    else 
     render :nothing => true 
    end 
    end 

ことを確認するためにどのような方法があることがコントローラのIは、rakeタスクを実行したときにメソッドが呼び出され、「作成」?

+0

あなたがrakeタスクでGoogleカレンダーのロジックを追加することができます'event'オブジェクトです。 – Sravan

+0

最良の方法は、バックafter_saveコールを使用して、モデルに 'Googleカレンダーのlogic'を移動することです。 – Sravan

答えて

0

あなたはafter_createレールは、コントローラから削除、google_calendarロジックを作成するためにModalにコールバックを使用することができます。

また、これはレールがDRY概念を次のようにコードを削減するのに役立ちます。イベントが作成されると、モデルコードが実行されます。あなたのオブジェクトが保存されますたび

class Event < ActiveRecord::Base 

after_create :google_calendar 
    . 
    . 
    . 
    . 

    private 
    def google_calendar 
     gcal_event = Google::Apis::CalendarV3::Event.new({ 
      summary: self.summary, 
      description: self.description, 
      start: { 
       date: self.start_date 
      }, 
      end: { 
       date: self.end_date 
      } 
     }) 

     @cal_service = GoogleCalendarService.new 
     @cal = @cal_service.calendar 

     result = @cal.insert_event(GoogleCalendarService::CALENDAR_ID, gcal_event) 

     self.calendar_event_id = result.id 
     self.save 
    end 
end 

このメソッドは、実行されます。だから、(それはコントローラやrakeタスクからのものであるかどうかは関係ありません)

、お使いのコントローラのアクションがなる、

def create 
    @event = Event.new(event_params) 

    respond_to do |format| 
     if @event.save 
     format.html { redirect_to @event, notice: 'Event successfully created.' } 
     format.js {} 
     format.json { render json: @event, status: :created, location: @event } 
     else 
     format.html { render 'new' } 
     format.json { render json: @event.errors, status: :unprocessable_entity } 
     end 
    end 

    end 

Here is a documentation of the various CallBacks

+0

うん、私はモデルに移動しなければならないと思った。私はちょうど怠惰なコーダーであったと思うし、コントローラメソッドをトリガすることが可能かどうか疑問に思っています。ありがとう。あなたはそれが役に立つ場合 – NeyLive

+0

@NeyLive、あなたは、私の答えを受け入れることができます。 :) – Sravan

関連する問題