2012-01-09 34 views
1

我正在使用ROR應用程序,並且在設計和密碼確認方面遇到困難。我希望我的用戶能夠編輯他們的信息(姓名,地址等),而不必輸入並確認他們的密碼(這是除非他們決定更改密碼,在這種情況下,這些字段是必需的。 )允許用戶在不保存密碼的情況下編輯帳戶並將條件傳遞給:reject_if在Ruby中

我在設計時做了一些閱讀,我發現這是一個常見問題。不幸的是,我嘗試了在設計GitHub倉庫上發佈的所有解決方案,但無法解決我的問題。

但是,我發現了一種解決方法,但是我希望這將是最後一步。以下是對我的players.rb文件看起來像一個小片段(我有兩個賬戶設定的 - 球員和老闆):

has_one :account, :as => :profile 

accepts_nested_attributes_for :account, :reject_if => proc { |attributes| attributes['password'].blank? } 

accounts.rb文件看起來像這樣:

devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me, :invited_by, :invited_by_id 

,因爲它的設置現在,玩家可以編輯他們的個人資料,而不必輸入密碼,除非他們正在編輯密碼字段 - 這是非常好的,而且是我期望的結果。但是,我遇到了一個小障礙......即使在創建新帳戶(玩家)時,:reject_if => proc { |attributes| attributes['password'].blank? }也會執行!這意味着如果玩家沒有輸入密碼,而不是提示他輸入密碼,那麼應用程序就會剎車!

我需要一些幫助來編寫一個if語句或者一些基本上只會觸發reject_if條件(如果該帳戶屬於註冊(現有)玩家的條件)。

我曾嘗試::reject_if => proc { |attributes| attributes['password'].blank? unless Player.new}

if Player.new 
accepts_nested_attributes_for :account 
else 
accepts_nested_attributes_for :account, :reject_if => proc { |attributes| attributes['password'].blank? } 
end 

我似乎無法想出解決辦法,所以我決定,看是否有人能夠提供的意見或建議。與往常一樣,我非常感謝您的時間和您可能提供的任何幫助。謝謝!

回答

1

在更新控制器中的用戶的同時,嘗試一下代碼的和平。這是設計版本1.5.3的更新方法,這兩行將做到這一點。

def update 
    self.resource = resource_class.to_adapter.get!(send(:"current_#{resource_name}").to_key) 

    params[:user].delete(:password) if params[:user][:password].blank? 
    params[:user].delete(:password_confirmation) if params[:user][:password_confirmation].blank? 

    if resource.update_attributes(params[resource_name]) 
     set_flash_message :notice, :updated if is_navigational_format? 
     sign_in resource_name, resource, :bypass => true 
     respond_with resource, :location => after_update_path_for(resource) 
    else 
     clean_up_passwords(resource) 
     respond_with_navigational(resource){ render_with_scope :edit } 
    end 
    end 
+0

很抱歉,這是行不通的。這是由設計通過GitHub提供的相同的代碼...我試過這個,不幸的是,它並沒有做到這一點。 – 2012-01-09 13:57:02

+0

我得到以下錯誤:「未定義的局部變量或方法'resource_class'」。我錯過了什麼嗎? – 2012-01-09 14:07:05

+0

我猜你正在使用一些舊版本的設計,試着安裝最新版本的設計。意味着刪除Gemfile.lock,然後捆綁安裝。 – 2012-01-10 06:04:04

1

我有這個問題狗我很長一段時間。按照「如何」,然後添加解決它:current_password到attr_accessible並創造了一個attr_accessor如下:

attr_accessor :password, :password_confirmation, :current_password 
attr_accessible :email, :password, :password_confirmation, :remember_me, :username, :current_password 

萬一別人運行到這個問題,這裏有relavent鏈接,幫我擺脫困境:

1) How To: Allow users to edit their account without providing a password

2) Can't resolve "Current password can't be blank" when editing user

3) Problems trying' to update the user profile info without password (this is the one that solved it for me)

此外,這裏有一個如何通過設計& Omniauth與Facebook做同樣的鉛:

4) Editing Users With Devise and Omniauth

相關問題