2016-07-21 58 views
1

我有一個接受參數列表的RESTful API(ActionController :: API)服務。 RESTful服務接受JSON主體請求(使用內容類型的應用程序/ json)。當調試控制器/動作(動作DEF後右),並在PARAMS列表採取一個高峯,它會顯示如下:Rails 5參數/強參數問題

<ActionController::Parameters {"given_name"=>"Mark", "subdomain"=>"development", "controller"=>"user", "action"=>"create", "user"=>{"given_name"=>"Mark"}} permitted: false> 

編輯 所有的請求中有(當它傳遞到控制器/動作 - 使用POSTman):

{"given_name":"Mark"} 

請注意,對象包含given_name參數兩次。這是正常的行爲嗎?我沒有將「用戶」對象(json對象)傳遞給控制器​​/操作?什麼是允許的標誌?

當我嘗試使用(現在我只是在測試REST調用和分配用戶對象將除...沒有驗證已編程還沒有任何值):

user = User.new(params) 

我得到的錯誤:

#<ActiveModel::ForbiddenAttributesError: ActiveModel::ForbiddenAttributesError> 

所以,我到處尋找這背後的原因(爲什麼會出現「用戶」在PARAMS列表關鍵什麼是許可標誌的目的,爲什麼我會得到一個錯誤?當我嘗試分配參數)?

編輯

做一些測試後,我改變控制器的名字從「user_controller」到「tester_controller」和設置的路由指向已重命名控制器。

看起來上面參數列表中的「user」對象已經變成了「tester」。那麼爲什麼參數列表包含一個「對象」,其中所有傳入的參數都帶有控制器的名稱?如果是這樣的話,爲什麼需要?

任何幫助將不勝感激。

+0

應該是'params ['user']'no?像這樣,你似乎試圖分配用戶的屬性'controller'或'action' – LolWalid

+0

當它通過它時,所有的請求都有:{「given_name」:「Mark」}。但在行動中,我得到了上面列出的參數。 – Sean

+0

因此,我將控制器從「user_controller」重命名爲「tester_controller」。看起來「user」=> {「given_name」:「Mark」}「已經改變爲」tester「=> {」given_name「:」Mark「}」。爲什麼有一個控制器名稱添加到參數列表中的「對象」? – Sean

回答

0

你需要指定哪些屬性是在您的控制器大衆分配接受指南。

def create 
    @user = User.new(params.require(:user).permit(:given_name)) 
end 

這防止惡意用戶進行,在一個用戶對象的情況下,改變屬性內部到應用程序,如role請求訊息。

如上所述,在參考strong parameters的指南中可以找到更好的解釋。

0

您無法將params傳遞給構造函數,因爲params總是包含:action:controller鍵。新對象的屬性應該放置在標識要創建模型的關鍵字下,例如:user。我建議你諮詢rails guides,特別是「Form Helpers」指南的chapter 7

如果您想了解更多有關強參數有一個chapter在軌也太:)