2014-03-02 24 views
0

我目前正在學習Ruby on Rails。我使用了強大的參數的Rails 4方法來指定哪些屬性可以在我的用戶模型中訪問。 這是我users_controller.rbRails 4:能夠修改不可訪問的屬性

class UsersController < ApplicationController 
    def create 
    User.create(user_params) 
    end 

    private 

    def user_params 
    params.require(:user).permit(:email) 
    end 
end 

然而,我能夠通過使用user.update_attributes(:id => 5, :name => "Bar"),不應該被允許更新用戶的不可訪問的屬性。這是爲什麼發生?難道我做錯了什麼?

編輯:我開始控制檯由rails console --sandbox。然後使用.save方法將一些用戶添加到數據庫,然後調用update_attributes方法。

+0

顯示更新操作 – Santhosh

+0

您是在控制器還是在控制檯中執行'update_attributes'調用?我問,因爲在控制器中沒有看到要更新的調用,強參數只能在控制器中使用。 – Aaron

+0

@Santosh:我剛剛使用'update_attributes'命令。 – Koderok

回答

2

strong_parameters保護你從質量分配在這個特定的控制器。它不能保護您在應用程序或控制檯中的其他位置使用批量分配。

因此,它不保護像attr_accessible那樣的模型。但這是它應該如何工作的。保護自己不是模型的工作。保護模型是控制器的工作。並且可能有一個Admin::UsersController,允許超過此UsersController

1

只有attr_accessible設置可以防止通過update_attributes質量分配,你不應該在你的應用程序做大規模分配(使用update_attributes)於不應該被改變的字段,因爲它也將跳過驗證

注:attr_accessible現在已經過時,所以我懷疑,你可以在導軌4使用它(如果你仍然想使用attr_accessible你需要添加protected_attributes到你的Gemfile)

+0

這不就是整個問題嗎?由於'attr_accessible'在Rails 4中已被棄用,這就是我使用強參數的原因。 – Koderok

+0

看到我的編輯,如果你仍然想使用'attr_accessible',你應該在''Gemfile''上添加'protected_attributes' gem – bjhaid

+0

是的,我知道,但我很想學習推薦的方法。 – Koderok