我正在尝试将更改密码字段拉到单独的表单中,但是使用方法devise_error_message获取错误!。
如果我删除方法更新工作正常,但是,如果验证失败,它会重定向到registrations / edit.html.erb并提供错误消息。我如何让它重定向回到registrations / change_password.html.erb视图并给出devise_error_messages! ?
我的所有代码: http://pastie.org/1907545
答案 0 :(得分:2)
我认为有一些事情需要解决。
1)在change_password操作中初始化资源
对devise_error_messages!
的调用失败,因为您未在resource
操作中初始化RegistrationsController#change_password
(您的用户模型实例)。一种方法是确保在authenticate_scope!
操作中调用在Devise :: RegistrationsController中实现的change_password
之前的过滤器。在RegistrationsController中尝试这样的事情。
class RegistrationsController < Devise::RegistrationsController
prepend_before_filter :authenticate_scope!, :only => [:edit, :update, :destroy, :change_password]
def create
...
end
end
如果这不起作用,您可能只想在authenticate_scope!
操作开始时致电change_password
。
2)在发生故障时重定向到change_password.html.erb
基本上,Devise::RegistrationsController#edit
操作和RegistrationsController#change_password
操作都会向Devise::RegistrationsController#update
操作提交表单。您要做的是确保在更新失败时,如果表单提交来自Devise::RegistrationsController#edit
操作,那么您将呈现registrations/edit.html.erb
视图,如果表单提交来自{{{ 1}}操作然后渲染RegistrationsController#change_password
视图。
有多种方法可以做到这一点,包括依靠flash哈希在registrations/change_password.html.erb
操作中设置密钥(例如RegistrationsController#change_password
),然后在发生错误时检查是否存在此密钥更新。另一种方法是在change_password表单中使用隐藏字段,然后类似地,如果在更新期间发生错误,则检查params散列中是否存在此隐藏字段。这样的事情。
flash[:change_password] = true
无论哪种方式,您都需要覆盖Devise :: RegistrationsController#udpate操作。像这样:
<h2>Edit <%= resource_name.to_s.humanize %></h2>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name),
:html => { :method => :put }) do |f| %>
<%= devise_error_messages! %>
<%= hidden_field_tag :change_password, true %>
尝试一下,但我认为这应该让你回到正轨。