2015-09-04 20 views
0

在腳手架形式的管理員控制器中,我們無需擔心集體作業,我們僅使用許可證實施了強大的參數!方法(no .require()或.permit()),它應該簡單地將params allowed標誌設置爲true,將params對象中的任何內容白名單。Rails 4.2.4 params.permit!未能忽略utf字段的形式

private 
    def foo_params 
     params.permit! 
    end 

,並在控制器中,我們有

def create 
    @foo = Foo.new(foo_params) 

然而,在規格和運行應用程序時,控制器的創建方法拋出的異常:

unknown attribute 'utf8' for Foo 

錯誤消失,如果我們添加.require(:MODEL)例如更改foo_params

private 
    def foo_params 
     params.require(:foo).permit! 
    end 

.require()是否應該避免拋出一個異常,這是由於像utf8屬性這樣的神奇添加的Rails窗體屬性?

(如果這有什麼差別是升級從Rails的3.2到4.2,否則正常工作的應用程序。)

回答

1

此問題是由從.require導致()的特殊性造成的。

基本上,當你提交時,params包含foo參數,以及其餘的參數。其中之一是utf8檢查。可能有其他人,如當前的動作和控制器,提交按鈕,CSRF令牌等,這可能是這樣的:

{ 
    utf8: '✓', 
    controller: 'foos', 
    action: 'create', 
    foo: { 
    name: 'Albert', 
    age: '12' 
    } 
} 

當你做params.permit!,您請求所有的則params的。這將不可避免地包含模型中不存在的屬性。

當您使用params.require(:foo).permit!,相反,你最終只能服用此位:

{ 
    name: 'Albert', 
    age: '12' 
} 

這是你想傳遞給你的Foo.new()叫什麼。

+0

或者,它會工作做'@foo = Foo.new(foo_params [:foo])',但這有點笨重...... –

+0

很好的解釋,謝謝! – jpwynn