2013-08-03 71 views
1

我按照devise's wiki regarding overriding update method to update user information without adding password中的說明操作,但我仍然收到通知,說我不能將密碼留空。我卡住了,我需要一些幫助來跟蹤問題。rails:設計無密碼更新用戶

<%= form_for(resource, :as => resource_name, :url => custom_update_user_registration_path, :html => { :method => :put }) do |f| %> 
    <%= devise_error_messages! %> 
    <%= f.text_field :first_name %> 
    <%= f.text_field :last_name %> 
    <%= f.email_field :email, :autofocus => true %> 
    <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %> 
    <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div> 
    <% end %> 
<%= f.submit "Update" %> 

在我的路線:

devise_for :user, :controllers => { :registrations => "registrations" }, :skip => [:registrations, :sessions] do 

    get 'signup' => 'devise/registrations#new', :as => :new_user_registration 
    post 'signup' => 'devise/registrations#create', :as => :custom_user_registration 
    get 'users/cancel' => 'devise/registrations#cancel', :as => :cancel_user_registration 
    get 'account/edit' => 'devise/registrations#edit', :as => :custom_edit_user_registration 
    put 'account' => 'devise/registrations#update', :as => :custom_update_user_registration 
    delete 'users/cancel' => 'devise/registrations#destroy' 
    # devise/sessions 
    get 'signin' => 'devise/sessions#new', :as => :new_user_session 
    post 'signin' => 'devise/sessions#create', :as => :user_session 
    delete 'signout' => 'devise/sessions#destroy', :as => :destroy_user_session 

    end 

這裏是我的控制器:

class RegistrationsController < Devise::RegistrationsController 
    before_filter :check_permissions, :only => [:new, :create, :cancel] 
    skip_before_filter :require_no_authentication 

    def check_permissions 
    authorize! :create, resource 
    end 

    def update 
    @user.attributes = params[:user] 
    # required for settings form to submit when password is left blank 
    if params[:user][:password].blank? && params[:user][:password_confirmation].blank? 
     params[:user].delete(:password) 
     params[:user].delete(:password_confirmation) 
    end 

    @user = User.find(current_user.id) 
    if @user.update_attributes(params[:user]) 
     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 
end 

我不知道爲什麼我得到我需要的還是提交密碼錯誤?有人能看到我忽略的東西嗎?

謝謝

回答

1

您可以處理您的模型通常的正確途徑。 只需編輯你的valdiations。這樣,你通常不需要覆蓋整個controller..just編輯模式:

validates :password, :presence => true, :on => :create 
1

試圖改變

if @user.update_attributes(params[:user]) 

到設備的方法

if @user.update_without_password(params[:user]) 
0

在課堂RegistrationsController < Devise :: RegistrationsController你缺少設計的更新參數。

def configure_permitted_parameters 
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, ...) } 
end 

def update 
# Get all params for :account_update 
account_update_params = devise_parameter_sanitizer.sanitize(:account_update) 

# Allow user to update without using password. 
if account_update_params[:password].blank? 
    account_update_params.delete("password") 
    account_update_params.delete("password_confirmation") 
end 

# Set current_user 
@user = User.find(current_user.id) 
if @user.update_attributes(account_update_params) 
    set_flash_message :notice, :updated 
    sign_in @user, :bypass => true 
    redirect_to after_update_path_for(@user) 
else 
    render "edit" 
end 
end