在重置密码表单上显示电子邮件

时间:2014-10-21 17:46:35

标签: ruby-on-rails ruby-on-rails-4 devise

我有一个像这样的重置密码表单

<%= form_for(resource, as: resource_name, url: password_path(resource_name), html: { method: :put }) do |f| %>
        <%= f.hidden_field :reset_password_token %>

        <div class="form-group ">
          <div class="input-group">
            <div class="input-group-addon">
              <span class="glyphicon glyphicon-envelope"></span>
            </div>
            <%= f.text_field :email, placeholder: resource.email, required: true, autofocus: true, class: "form-control", disabled: true %>
          </div>
        </div>

我希望上面字段的占位符是资源的电子邮件,但此时resource仅包含字段reset_password_token,如下所示

=> #<Company id: nil, name: nil, email: nil

如何以此格式显示资源的电子邮件?

2 个答案:

答案 0 :(得分:1)

如果你看一下设计代码,这种行为是完全有意义的:

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/passwords_controller.rb

编辑方法:

def edit
  self.resource = resource_class.new
  resource.reset_password_token = params[:reset_password_token]
end

它只是创建一个新资源(例如User)并指定reset_password_token。

您可以通过滚动自己的密码控制器来更改此行为。 您可以通过继承devise的控制器并覆盖编辑方法来实现此操作,以便它实际加载您的资源(可能是用户)。

从我的头脑中,这样的事情可以发挥作用。

class CustomPasswordsController < Devise:: PasswordsController
  def edit
    reset_password_token = params[:reset_password_token]
    self.resource = resource_class.find_by_reset_password_token(reset_password_token)    
  end
end 

然后在您的routes.rb中,配置devise以使用您的自定义控制器

devise_for :users,
  :controllers => {:passwords=>"custom_passwords"}

答案 1 :(得分:0)

我找到了答案:新设备有一个方法名with_reset_password_token,通过重置密码令牌找到资源。
然后我在我的PasswordsController

中这样做了
def edit
 super
 @email = Company.with_reset_password_token(params[:reset_password_token]).email
end

这样做了,但非常感谢大家