覆盖RefineryCMS为普通用户重置密码功能

时间:2012-09-05 08:19:17

标签: ruby-on-rails-3

我正在使用refinerycms并覆盖重置密码的功能。 这是我的密码查看页面:

密码/ new.html.erb

<h2>Forgot your password?</h2>
<%= form_for(resource, :as => resource_name, :url => refinery.user_password_path, :html => { :method => :post }) do |f| %>

<div><%= f.label :email %><br />
<%= f.email_field :email %></div>

<div><%= f.submit "Send me reset password instructions" %></div>
<% end %>

密码/ edit.html.erb

<h2>Change your password</h2>   

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

<div><%= f.label :password, "New password" %><br />
<%= f.password_field :password %></div>

<div><%= f.label :password_confirmation, "Confirm new password" %><br />
<%= f.password_field :password_confirmation %></div>

<div><%= f.submit "Change my password" %></div>
<% end %>

,密码控制器为:

 class PasswordsController < Devise::PasswordsController
   helper Refinery::Core::Engine.helpers
   before_filter :store_password_reset_return_to, :only => [:update]

   def store_password_reset_return_to
     session[:'refinery_user_return_to'] = refinery.admin_root_path
   end
   protected :store_password_reset_return_to

   # Rather than overriding devise, it seems better to just apply the notice here.
   after_filter :give_notice, :only => [:update]
   def give_notice
     Rails.logger.debug @refinery_user
     if %w(notice error alert).exclude?(flash.keys.map(&:to_s)) or             @refinery_user.errors.any?
    flash[:notice] = t('successful', :scope => 'users.reset', :email => @refinery_user.email)
     end
  end
   protected :give_notice

   # GET /registrations/password/edit?reset_password_token=abcdef
   def edit
    if params[:reset_password_token] and (  @refinery_user = Refinery::User.where(:reset_password_token => params[:reset_password_token]).first).present?
      #Rails.logger.debug @refinery_user
      #logger.debug"******************************************************"
      respond_with(@refinery_user)
    else
      redirect_to refinery.new_user_password_path,
                :flash => ({ :error => t('code_invalid', :scope => 'refinery.users.reset') })
    end
  end

    # POST /registrations/password
    def create
    if params[:user].present? and (email = params[:user][:email]).present? and (user = Refinery::User.where(:email => email).first).present?

      # Call devise reset function.
      user.send(:generate_reset_password_token!)
      UserMailer.reset_notification(user, request).deliver
      redirect_to refinery.new_user_session_path,:notice => t('email_reset_sent', :scope => 'users.forgot')
    else
        flash.now[:error] = if (email = params[:user][:email]).blank?
        t('blank_email', :scope => 'users.forgot')
      else
        t('email_not_associated_with_account_html', :email => ERB::Util.html_escape(email), :scope => 'users.forgot').html_safe
      end
      render :new
    end
  end
end

邮件成功通过电子邮件发送重置通知和编辑密码链接但是 当我输入新密码并点击输入时会出现错误   “未定义的方法email' for nil:NilClass",app/controllers/passwords_controller.rb:15:in give_notice'。 我该如何删除该错误?请帮助!!

1 个答案:

答案 0 :(得分:0)

结果是简单地删除give_notice方法并使用password / edit.html.erb中的错误消息字段:

<% if resource.try(:errors) %>
  <%= devise_error_messages! %>
<% end %>