有你應該考慮改變你的代碼的幾件事情:
- 您沒有使用交易
- 你做了太多的控制器
說罷你出現問題的原因可能是由於生產和開發之間的環境差異造成的,最有可能是這樣的:
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。
我希望這有助於!
感謝您的迴應,jonnii ...非常感謝!我沒有自己寫代碼 - 我只是在調試它 - 但是你的解決方案更加優雅。另外,事實證明問題出在Phusion Passenger上;我想將舊版本的文件重命名爲「vendors_controller_031610.rb」,以防萬一需要快速恢復,並且事實證明Phusion即使在重新啓動後也使用過時的控制器。刪除舊文件解決了問題。奇怪,呃? – justinbach 2010-03-16 15:10:57