2014-10-09 54 views
2

我已經開始學習Rails,並且陷入了第9章的第三個練習。Railstutorial.org邁克爾哈特爾第9章練習3「不應該允許通過網絡編輯管理員屬性」

鍛鍊看起來是這樣的:

test "should not allow the admin attribute to be edited via the web" do 
    log_in_as(@other_user) 
    assert_not @other_user.admin? 
    patch :update, id: @other_user, user: { password:    FILL_IN, 
              password_confirmation: FILL_IN, 
              admin: FILL_IN } 
    assert_not @other_user.FILL_IN.admin? 
    end 

我的問題是last Fill_IN >> assert_not @other_user.FILL_IN.admin

@other_user從夾具取出,看起來像這樣:

archer: 
    name: Sterling Archer 
    email: [email protected] 
    password_digest: <%= User.digest('password') %> 

Update action看起來是這樣的:

def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(user_params) 
     flash[:success] = "Profile updated" 
     redirect_to @user 
    else 
     render 'edit' 
    end 
    end 

我還添加:admin到user_params所以:admin param可以修改:

def user_params 
    params.require(:user).permit(:name, :email, :password, 
           :password_confirmation, :admin) 
end 

answe r我認爲是正確的是:

test "should not allow the admin attribute to be edited via the web" do 
    log_in_as(@other_user) 
    assert_not @other_user.admin? 
    patch :update, id: @other_user, user: { password:    @other_user.password, 
              password_confirmation: @other_user.password_confirmation, 
              admin: true } 
    assert_not @other_user.admin? 
    end 

但它看起來像@other_user沒有被修改,所以我認爲該錯誤是在最後斷言。

我的答案是錯的,我不能讓這個測試失敗了,這是因爲在過去的斷言"assert_not @other_user.FILL_IN.admin?"

我不知道要放什麼東西在FILL_IN部分。我試圖切斷FILL_IN,但這不起作用。

+0

你的問題是什麼? – Substantial 2014-10-09 04:18:06

+0

assert_not @ other_user.FILL_IN.admin?<<填寫FILL_IN以提交此測試的內容。 – Kask 2014-10-09 04:31:19

回答

18

在對基礎記錄進行更改後,您必須重新加載實例變量。這將加載新的更改。我通過Hartl的教程工作,也和我想如果你在PATCH請求密碼設置爲@other_user.password(以及密碼確認),然後 - 關於你的代碼

assert_not @other_user.reload.admin? 
+0

好吧,我得到它運行。 Thnx !!!!!! – Kask 2014-10-09 04:54:52

0

一件事即使user_params中允許:user,您的測試將爲綠色,測試在該點實際上應該是紅色。

發生這種情況是因爲:archer在您的users.yml燈具文件中沒有:password屬性;他只有password_digest: <%= User.digest('password') %>,並且在密碼被散列後就不能取消散列密碼,就像他一樣。

只要改變項

{ password: 'password', password_confirmation: 'password' ... } 

和測試應該測試正確的事情。

2

如今,隨着教程的第4版,使用Rails 5.0.0,我的回答是:

test "should not allow the admin attribute to be edited via the web" do 
    log_in_as(@other_user) 
    assert_not @other_user.admin? 
    patch user_path(@other_user), params: { 
            user: { password:    "", 
              password_confirmation: "", 
              admin: true } } 
    assert_not @other_user.reload.admin? 
end 

密碼和password_confirmation字段可以留空,恕我直言,如另一個例子,列表10.11所示(在Rails 5版本中)。

相關問題