Есть несколько вещей, которые вы должны изменить в своем коде:
- Вы не используете транзакции
- Вы слишком много делаете в контроллере
Сказав, что причина вашей проблемы, вероятно, связана с различиями в среде между производством и разработкой, скорее всего, это:
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
n.b. Я не проверял это, это может не сработать, но вы должны понять ... если у вас есть модульные тесты (что, я надеюсь, вы делаете ...), вы сможете его уронить и посмотреть, работает ли он!
Следующим шагом будет использование accepts_nested_attribute_for для вашего объекта регистрации, чтобы его можно было отправлять как часть пользовательских параметров.
Я также реорганизовал бы это так, чтобы все настройки ролей и т. Д. Выполнялись в обратных вызовах .
На этом этапе ваше действие create
, скорее всего, будет действительно простым, и вы можете переключить свой контроллер на использование унаследованных ресурсов .
Надеюсь, это поможет!