Problema con send_reset_password_instructions

36 views
Skip to first unread message

josedes

unread,
Oct 16, 2015, 11:39:45 PM10/16/15
to rubysur
Hola a todos, estoy tratando de implementar la recuperación de contraseña, que en devise es Reset de la misima, pero me está dando en el siguiente error:

NoMethodError at /usuarios/password

private method `send_reset_password_instructions' called for #<Usuario:0x007fcae0ce7400>


Agradecería la ayuda


El controlador es el siguiente: 

class Devise::PasswordsController < DeviseController

  include CodigosGenerales

  before_filter :authenticate_usuario!

  before_action :cargarOpcionesDelPrincipal

  prepend_before_filter :require_no_authentication

  append_before_filter :assert_reset_token_passed, :only => :edit

  layout :colocar_layout


 def new

    self.resource = resource_class.new


  end


  def edit

    @usuario = current_usuario    

  end


def create

     self.resource = @usuario.send_reset_password_instructions(resource_params)

     @usuario.send_reset_password_instructions

     yield resource if block_given?

     if successfully_sent?(resource)

       respond_with({}, location: after_sending_reset_password_instructions_path_for(resource_name))

     else

      respond_with(resource)

    end

end


  def update

    @usuario = Usuario.find(current_usuario.id)

    @usuario.saltar_validacion_usuario = true

    if @usuario.update_with_password(usuario_params)

      # Sign in the user by passing validation in case their password changed

      sign_in @usuario, :bypass => true

      current_usuario = @usuario

      flash.now[:success] = "Su contraseña fue modificada exitosamente"

      render "edit"

    else

      render "edit"

    end

  end


private

  def usuario_params

    params.require(:usuario).permit( :email,  :saltar_validacion_usuario)

  end


end


Y el formulario es el siguiente:


<h2>Olvido su password</h2>

<div class="clearfix"></div>

<div class="page_title">

<div class="container">

   <div class="title">

      <h1>Olvido su password?</h1>

   </div>

   <div class="pagenation">

      &nbsp;

      <%#= link_to "Inicio", root_path %> 

      <!-- <i>/</i><a href="#">Features</a> <i>/</i> Page Columns</div> -->

   </div>

</div>

<!-- end page title --> 

<!-- Contant

   ======================================= -->

<div class="container">

<div class="content_fullwidth2">

   <div class="one_half_center">

      <div class="framed-box">

         <div class="framed-box-wrap">

            <div class="pricing-title">

               <h3>Recuperación de datos de acceso</h3>

            </div>

            <div class="pricing-text-list">

               <%= simple_form_for(resource, as: resource_name,:url => password_path(resource_name), :html => { :method => :post }) do |f| %>

               <%= f.error_notification %>

               <% if @usuario.errors.any? %>

               <div class="alert alert-danger">

                  <ul>

                     <% @usuario.errors.each do |key, message| %>

                     <%if key.to_s == "email"%>

                     <li><%= message %></li>

                     <%end%>

                     <%end%>

                  </ul>

               </div>

               <br />

               <% end %>

               <div class="form-group">

                  <%= f.label "Email:",:class=>"control-label col-md-4" %>

                  <div class="input-group col-md-7">

                     <%= f.text_field :email, required:true, :class=>"form-control",:placeholder=>"Dirección de correo electrónico", autofocus: true %>      

                  </div>

               </div>

               <div class="form-actions" align="center">

                  <%= f.button :submit, "Recibir instrucciones para restablecer la contraseña", :class=> "btn btn-primary" %>

               </div>

               <br />

               <% end %>

               <%= render "devise/shared/links" %>

            </div>

         </div>

      </div>

   </div>

   <!-- end section -->

</div>

<!-- end content area -->

<div class="clearfix mar_top5"></div>

samu verdor

unread,
Oct 18, 2015, 11:42:42 AM10/18/15
to rub...@googlegroups.com

Has actualizado recientemente Devise? Igual ya no funciona como esperas

https://github.com/plataformatec/devise/blob/master/lib/devise/models/recoverable.rb



    # Resets reset password token and send reset password instructions by email.
      # Returns the token sent in the e-mail.
      def send_reset_password_instructions
        token = set_reset_password_token
        send_reset_password_instructions_notification(token)

        token
      end


      protected

        module ClassMethods

          # Attempt to find a user by its email. If a record is found, send new
          # password instructions to it. If user is not found, returns a new user
          # with an email not found error.
          # Attributes must contain the user's email
          def send_reset_password_instructions(attributes={})
            recoverable = find_or_initialize_with_errors(reset_password_keys, attributes, :not_found)
            recoverable.send_reset_password_instructions if recoverable.persisted?
            recoverable
          end

        end


--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Jose De Sousa

unread,
Oct 20, 2015, 12:33:06 PM10/20/15
to rubysur
Que tal amigo, gracias por responder, la versión que tengo instalada es 3.5.1, y la más nueva es 3.5.2, no creo que haya mucha diferencia, que crees vale la pena actualizarlo?

José
--
OtusNet ©
Soluciones inteligentes
@ sus necesidades en Internet
Joselito De Sousa
(058)-0412.222.98.25

Emanuel Friedrich

unread,
Oct 20, 2015, 8:32:51 PM10/20/15
to rub...@googlegroups.com
capo!

Sacaste este código de un ejemplo de alguna parte? El error es claro, estás accediendo a un método protegido/privado.

Fijate borrando la segunda llamada a send_reset_password_instructions en el create del controller, que no sé para que la hacés. 
Emanuel Friedrich 

Cel: 3754-442896

Jose De Sousa

unread,
Oct 20, 2015, 10:40:51 PM10/20/15
to rubysur
Hola Emanuel gracias,  si lo saque de un ejemplo para hacer la recuperación del password vía un reset vía devise entiendo el mensaje del error lo que no veo es por que lo da si se supone que debería funcionar inclusive la documentación de devise lo dice así.

Si tienes razon se me quedo esa instrucción de más, pero  con la primera instrucción;

self.resource = @usuario.send_reset_password_instructions(resource_params)

tampoco me funciona me da el mismo error

Entonces no entiendo que pasa

samu verdor

unread,
Oct 21, 2015, 5:56:29 AM10/21/15
to rub...@googlegroups.com
Hola otra vez.

Lo primero que tienes que mirar es para que versión es el ejemplo. Creo que a a partir de la versión 3.5, el reset manda un token que es diferente al hash que se guarda en la base de datos. Vamos, que todos los ejemplos que veas de versiones anteriores no te funcionas si no los adaptas.

Tambien parece que se han sobreescrito algunos metodos del modulo, me imagino que en el modelo del usuario. Si no es asi, como dice Emanuel, no puedes acceder a "@usuario.send_reset_password_instructions(resource_params)" con parámetros pero si a "@usuario.send_reset_password_instructions" sin parametros.

Creo que o te falta código o es una modificación para versiones anteriores.

Saludos.
Reply all
Reply to author
Forward
0 new messages