2013-08-09 10 views
5

mi preoccupa la soluzione qui sarà tristemente ovvio, ma sto avendo difficoltà a attuare le istruzioni sul wiki Devise (https://github.com/plataformatec/devise/wiki/How-To%3a-Allow-users-to-edit-their-account-without-providing-a-password)ancora ottenere "Password attuale non può essere vuoto" Registrazione Modifica dopo aver seguito wiki

Sto usando Rails 4. Dopo aver seguito il wiki, sto ancora ricevendo "la password corrente non può essere vuota". Ecco la mia configurazione. Qualsiasi assistenza è molto apprezzata!

REGISTRATIONS_CONTOLLER.rb

class RegistrationsController < Devise::RegistrationsController 
    def update 
    @user = User.find(current_user.id) 

    successfully_updated = if needs_password?(@user, params) 
     @user.update_with_password(devise_parameter_sanitizer.for(:account_update)) 
     # Rails 3: @user.update_with_password(params[:user]) 
    else 
     # remove the virtual current_password attribute update_without_password 
     # doesn't know how to ignore it 
     params[:user].delete(:current_password) 
     @user.update_with_password(devise_parameter_sanitizer.for(:account_update)) 
     # Rails 3: @user.update_without_password(params[:user]) 
    end 

    if successfully_updated 
     set_flash_message :notice, :updated 
     # Sign in the user bypassing validation in case his password changed 
     sign_in @user, :bypass => true 
     redirect_to after_update_path_for(@user) 
    else 
     render "edit" 
    end 
    end 

    private 
    # check if we need password to update user data 
    # ie if password or email was changed 
    # extend this as needed 
    def needs_password?(user, params) 
    user.email != params[:user][:email] || 
     params[:user][:password].present? 
    end 
end 

APPLICATION_CONTROLER.rb

class ApplicationController < ActionController::Base 
    protect_from_forgery with: :exception 

    before_filter :configure_permitted_parameters, if: :devise_controller? 

    def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:account_update) do |u| 
     u.permit(:first_name, :last_name, :username, :email, :avatar, :password, :password_confirmation) 
    end 
    devise_parameter_sanitizer.for(:sign_up) do |u| 
     u.permit(:first_name, :last_name, :username, :email, :password, :password_confirmation) 
    end 
    devise_parameter_sanitizer.for(:sign_in) do |u| 
     u.permit(:username, :email, :password) 
    end 
    end 
end 

routes.rb

ProjectFoo::Application.routes.draw do 
    devise_for :users, :controllers => { :registrations => "registrations", 
             :invitations => 'users/invitations' } 

Nota: Sto anche utilizzando la gemma devise_invitable

VISTA/DEVISE/ISCRIZIONI/EDIT.html.erb

<h2>Edit <%= resource_name.to_s.humanize %></h2> 
<%= image_tag @user.avatar.url(:square) %> 

<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :method => :put, :class => 'form-horizontal' }) do |f| %> 
    <%= devise_error_messages! %> 

    <div class="span5"> 
    <div class="control-group"> 
     <%= f.label :email, :class => 'control-label' %> 
     <div class="controls"> 
      <%= f.email_field :email, :autofocus => true, :class => 'text_field' %> 
     </div> 
    </div> 

    <div class="control-group"> 
    <%= f.label :username, :class => 'control-label' %> 
     <div class="controls"> 
     <%= f.text_field :username, :autofocus => true, :class => 'text_field' %> 
     </div> 
    </div> 

    <div class="control-group"> 
     <%= f.label :first_name, :class => 'control-label' %> 
     <div class="controls"> 
      <%= f.text_field :first_name, :autofocus => true, :class => 'text_field' %> 
     </div> 
    </div> 

    <div class="control-group"> 
     <%= f.label :last_name, :class => 'control-label' %> 
     <div class="controls"> 
      <%= f.text_field :last_name, :autofocus => true, :class => 'text_field' %> 
     </div> 
    </div> 

    <div class="control-group"> 
     <%= f.label :twitter_handle, :class => 'control-label' %> 
     <div class="controls"> 
     <%= f.text_field :twitter_handle, :autofocus => true, :class => 'text_field' %> 
     </div> 
    </div> 

    <div class="control-group"> 
     <%= f.label :avatar, :class => 'control-label' %> 
     <div class="controls"> 
      <%= f.file_field :avatar, :class => 'file_field' %> 
     </div> 
    </div> 
    </div> 

    <div class="span5"> 
    <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %> 
     <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div> 
    <% end %> 

    <div class="control-group"> 
     <%= f.label :password, :class => 'control-label' %> 
     <div class="controls"> 
      <%= f.password_field :password, :autocomplete => "off", :class => 'password_field' %><br><i>(leave blank if you don't want to change it)</i> 
     </div> 
    </div> 

    <div class="control-group"> 
     <%= f.label :password_confirmation, :class => 'control-label' %> 
     <div class="controls"> 
      <%= f.password_field :password_confirmation, :class => 'password_field' %> 
     </div> 
    </div> 

    <div class="control-group"> 
     <%= f.label :current_password, :class => 'control-label' %> 
     <div class="controls"> 
     <%= f.password_field :current_password, :class => 'password_field' %><p><i>(we need your current password to confirm your changes)</i></p> 
     </div> 
    </div> 
    <%= f.submit "Update" %> 

    </div> 
<% end %> 

<div class="span11"> 
    <hr> 
</div> 

<div class="span11"> 
    <h3>Cancel my account</h3> 

    <p>Unhappy? <%= button_to "Cancel my account", registration_path(resource_name), :data => { :confirm => "Are you sure?" }, :method => :delete %></p> 

    <p><%= link_to "Back", :back %></p> 
</div> 

risposta

5

Hai update_with_password due volte. La seconda volta dovrebbe essere update_without_password.

+0

grazie bgates. buon fine settimana. –

0

Ho avuto lo stesso problema per ore. Nella mia situazione particolare avevo molti attributi utente personalizzati che potevano essere aggiornati da diversi partial. Assicurati di aggiungere almeno campi nascosti - nome ed email - come richiesto da needs_password?

Problemi correlati