2013-08-28 77 views
2

我想更改編輯密碼的過程。在編輯密碼頁面上,我有一個字段:foo,我想檢查用戶是否正確輸入了它。設計更新密碼

我創建PasswordsController和覆蓋更新的方法,在這裏我添加的代碼進行測試,如果:foo是相同的數據庫:

def update 
    self.resource = resource_class.reset_password_by_token(resource_params) 

    # this is code that I added 
    unless self.resource.foo == params[resource_name][:foo] 
     self.resource.errors.add(:foo, "Foo not correct") 
    end 

    if resource.errors.empty? 
     resource.unlock_access! if unlockable?(resource) 
     flash_message = resource.active_for_authentication? ? :updated : :updated_not_active 
     set_flash_message(:notice, flash_message) if is_navigational_format? 
     sign_in(resource_name, resource) 
     respond_with resource, :location => after_resetting_password_path_for(resource) 
    else 
     binding.pry 
     respond_with resource 
    end 
    end 

想我進入「測試」:富場,但在數據庫中它的價值是假的」。它將在視圖上打印錯誤(「Foo不正確」),但它將填充:具有來自數據庫(「假」)的值的foo字段,而不是用我輸入的值(「測試」)。

我應該重新定義reset_password_by_token或使用我的自定義方法,但想知道是否有更好的方法來解決這個問題?

回答

0

嘗試使用before_action(可能的before_filter,這取決於你的Rails版本):

class PasswordsController < ... 

    before_action :check_foo, :only => :update 

    ... 

    private 

    def check_foo 
     # get resource 
     # check foo 
     # redirect if foo is not valid 
    end 

end 

你也很可能改變這種只擴展現有RegistrationsController。只需重新使用update的現有Devise實現,而無需重新實現它,只需在前面添加過濾器即可。

爲了防止在物體上更新所述:foo,過濾params散列,除去:foo字段,它傳遞給reset_password_by_token之前。如果您使用的是Rails 4, or Strong Parameters,只是不允許它。

0

的形式在球場上使用不同的名稱(讓我們說「棒」),然後你會測試更改爲:

... 
unless self.resource.foo == params[resource_name][:bar] 
    self.resource.errors.add(:foo, "Foo not correct") 
end 
... 

注:在視圖中,您將無法使用表單構建器的東西,因爲如果'bar'不是模型對象的屬性,它會窒息,但是你可以直接使用html或rails helper方法(如FormTagHelper::text_field_tag)將任何標記添加到表單中。