4

我在使用Phusion Passenger部署的Rails站點上進行維護工作。工作流程與標準的三層Railsian測試開發生產安排稍有不同;相反,針對並行Oracle數據庫運行的是相同代碼庫的兩個單獨安裝;開發網站的生活在qa.domain.com,並在www.domain.com網站Rails:在開發和生產上的不同行爲

我在下面的代碼片段(來自'兩個環境:

代碼中的註釋之間破壞剛創建的用戶對象,如果該系統無法創建相應的註冊。它在開發服務器上工作正常,但不在生產服務器上,即使保存註冊失敗,用戶對象仍頑固地掛在數據庫周圍。將更改推送到生產是一個簡單的事情,即上傳控制器文件並通過shell執行touch tmp/restart.txt。這兩個代碼庫在其他方面是相同的;什麼可能導致這種差異?

感謝您的考慮!

賈斯汀

編輯:有在production.rb橫跨兩個安裝一些差異,可能會幫助診斷問題。在生產時,

config.cache_classes = true 

# Full error reports are disabled and caching is turned on 
config.action_controller.consider_all_requests_local = false 
config.action_controller.perform_caching    = true 

在開發時,這三個標誌被設置爲它們的反值。謝謝!

回答

1

有你應該考慮改變你的代碼的幾件事情:

  1. 您沒有使用交易
  2. 你做了太多的控制器

說罷你出現問題的原因可能是由於生產和開發之間的環境差異造成的,最有可能是這樣的:

config.cache_classes = false 

但是,我認爲你不應該在生產中改變它,因爲它會減慢你的所有行動。相反,我建議有一個與您的生產環境非常匹配的臨時環境。

解決您的問題,我想最有可能改寫這樣的動作:

# using before filters will keep your actions tight 
before_filter :cannot_create_user, :if => :signed_in? 

def create 
    # setup all the objects 
    @user = User.new(params[:user]) 

    @user.user_type = 'vendor' 
    @user.active = 1 

    @user.has_role 'owner', @user 
    @user.has_role 'vendor' 

    @registration = @user.registrations.build(params[:registration]) 
    @registration.active = 1 
    @registration.email = @user.email 

    # make sure everything is valid before trying to save and activate 
    if @user.valid? 
    @user.save! # might not need this if activate calls save! 
    @user.activate! 

    # this should probably be a sign_in() method... 
    self.current_user = @user 

    send_confirmation(@user) 
    send_solicitations_notifications(@registration) if @registration.notification_desired? 

    redirect_to thank_you_vendors_path 
    else 
    respond_to do |format| 
     format.html { render :action => 'new' } 
     format.xml { render :xml => @registration.errors, :status => :unprocessable_entity } 
    end 
    end 

... 
end 


protected 

def signed_in? 
    !current_user.nil? 
end 

def cannot_create_user 
    respond_to do |format| 
    format.html { render :action => 'new' } 
    format.xml { render :xml => @user.errors, :status => :unprocessable_entity } 
    end 
end 

注:我沒有測試這個,它可能不起作用,但你應該明白......如果你有單元測試(我希望你這樣做),你應該能夠放下它,看看它是否工作!

您的下一步將使用使用accepts_nested_attribute_for作爲您的註冊對象,以便它可以作爲用戶參數的一部分提交。

我也會重構這個,以便所有的角色設置等都在callbacks完成。

此時,您的create操作很可能非常簡單,您可以切換控制器以使用inherited resources

我希望這有助於!

+0

感謝您的迴應,jonnii ...非常感謝!我沒有自己寫代碼 - 我只是在調試它 - 但是你的解決方案更加優雅。另外,事實證明問題出在Phusion Passenger上;我想將舊版本的文件重命名爲「vendors_controller_031610.rb」,以防萬一需要快速恢復,並且事實證明Phusion即使在重新啓動後也使用過時的控制器。刪除舊文件解決了問題。奇怪,呃? – justinbach 2010-03-16 15:10:57

相關問題