RoR 3:设计,拆分编辑用户表单以分隔更改密码,devise_error_message没有方法错误!

时间:2011-05-16 01:45:40

标签: ruby-on-rails ruby-on-rails-3 forms devise

我正在尝试将更改密码字段拉到单独的表单中,但是使用方法devise_error_message获取错误!。

如果我删除方法更新工作正常,但是,如果验证失败,它会重定向到registrations / edit.html.erb并提供错误消息。我如何让它重定向回到registrations / change_password.html.erb视图并给出devise_error_messages! ?

我的所有代码: http://pastie.org/1907545

1 个答案:

答案 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 %>

尝试一下,但我认为这应该让你回到正轨。