我尝试引发错误,然后呈现注册控制器的编辑页面。但当我点击错误时页面冻结,我收到此错误。
No template found for RegistrationsController#update rendering head :no_content
Completed 204 No Content in 698ms (ActiveRecord: 2.3ms)
这是我的控制器动作
def update
resource.transaction do
super do |user|
if membership_params.present?
ToggleAlertEmails.perform(user: current_user, params: membership_params)
end
if user.errors[:current_password].present?
raise ActiveRecord::Rollback
redirect_to edit_user_registrations_path
end
end
end
end
当我点击raise ActiveRecord:Rollback
时,它实际上回滚了我想要的更改,但它不会继续并呈现编辑页面。我怎样才能做到这一点?
答案 0 :(得分:0)
将redirect_to edit_user_registrations_path
移到事务外部,使用标志(下例中的error
)仅在执行回滚时重定向,如下所示:
def update
error = false
resource.transaction do
super do |user|
if membership_params.present?
ToggleAlertEmails.perform(user: current_user, params: membership_params)
end
if user.errors[:current_password].present?
error = true
raise ActiveRecord::Rollback
end
end
end
redirect_to edit_user_registrations_path if error
end
或者,如果您愿意,请避开该标记并再次使用user.errors[:current_password].present?
:
redirect_to edit_user_registrations_path if user.errors[:current_password].present?
虽然您发布的具体错误是因为update
操作没有视图(例如update.html.erb
),因此您需要创建一个或通过render
指定另一个渲染/重定向/ redirect_to
。
如果您想要始终重定向到edit
,请避开最终if
并仅保留redirect_to
:
redirect_to edit_user_registrations_path
如果要在没有回滚时重定向到其他操作或呈现不同的视图(即update
和edit
),请使用完整的if
/ {{ 1}}声明:
else
请记住,无论您选择哪种方案,都应在交易之外添加渲染/重定向。