2013-08-09 15 views
5

mir die Lösung hier Sorge folgenden Registrierung bearbeiten „Aktuelles Passwort darf nicht leer sein“ wird woefully offensichtlich sein, aber ich habe Probleme mit den Anweisungen auf der Wiki Devise Umsetzung (https://github.com/plataformatec/devise/wiki/How-To%3a-Allow-users-to-edit-their-account-without-providing-a-password)Noch immer nach dem Wiki

Ich verwende Rails 4. Nachdem ich dem Wiki gefolgt bin, erhalte ich immer noch "aktuelles Passwort kann nicht leer sein". Hier ist mein Setup. Jede Hilfe wird sehr geschätzt!

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' } 

Hinweis: Ich bin auch der devise_invitable gem

ANSICHTEN/DEVISE/ANMELDUNGEN/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> 

Antwort

5

Sie haben update_with_password zweimal verwenden. Das zweite Mal sollte update_without_password sein.

+0

danke bgates. habe ein schönes Wochenende. –

0

Ich hatte das gleiche Problem für Stunden. In meiner speziellen Situation hatte ich viele benutzerdefinierte Benutzerattribute, die von verschiedenen Partials aktualisiert werden konnten. Stellen Sie sicher, dass Sie mindestens versteckte Felder - Name und E-Mail - hinzufügen, wie von needs_password gefordert?

Verwandte Themen