2016-04-13 32 views
1

我有一些按鈕來清除集合,因此很容易在開發/測試期間將網站恢復到原始狀態,而無需重新啓動服務器。從Rails應用程序執行seeds.rb

如何在控制器動作內執行seeds.rb的內容?

def purge 
    if Rails.env.production? 
    should_not_happen(severity: :armageddon) 
    else 
    # Well at least restore one admin account ! 
    User.all.each(&:destroy) 
    regenerate_main_admin_accounts # Here I need to replay the content of `seeds.rb` 
    redirect_to(admin_dashboard_path) 
    end 
end 

注:我seeds.rb文件的內容廣泛使用的是檢查數據是否存在的條件語句和方法,我可以運行十億次會有在DB沒有重複的數據,所以即使只恢復1%的消耗(我們在這裏說的是開發/測試環境,沒有時間/資源壓力),我也可以運行它。

+0

與[在控制器中運行rake任務]類似的問題(http://stackoverflow.com/q/1170148/567863)? –

回答

1

假設你知道,這不是一個好主意,它可能涉及安全問題,則可以使用Rake::Task["<rake_command>"].execute

哪裏<rake_command>是你rake從命令行運行後聲明。

require 'rake' 
require 'rake/task' 

# We want to make sure tasks are loaded without running them more than once: 
Rake::Task.clear 
<AppName>::Application.load_tasks 


class SeedsController < ApplicationController 

    def run 
    Rake::Task["db:seed"].execute 

    redirect_to "/" # Or wherever... 
    end 

end 

出於好奇,你爲什麼要這麼做?

+0

我將這種用法限制在開發/測試環境中。我們還在Sandbox模式下使用亞馬遜SES,因此我們只有有限數量的電子郵件地址可以使用,並且再次測試我們的訂閱流程/流程,這對於清除集合非常方便。當我們需要快速測試新對象的創建時,FactoryGirl工廠也變得非常方便(atm我們沒有很多自動化測試,有些人手動測試) –

+0

感謝您的回答。最後,我將代碼和需求導出到實用程序模塊的特定方法。 –

相關問題