0

的文檔(http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters)在強大的參數使用的例子是:的Rails 4.0.0強大的參數似乎沒有工作,因爲記錄

params.require(:person).permit(:name, :age) 

但是,這並不工作,因爲需要()返回可以調用參數的值,而不是另一個可以調用permit()的參數對象。

$ rails console 
1.9.3p286 :005 > params = ActionController::Parameters.new(person: 1, name: "Joe", age: 30) 
=> {"person"=>1, "name"=>"Joe", "age"=>30} 
1.9.3p286 :006 > params.require(:person).permit(:name, :age) 
NoMethodError: undefined method `permit' for 1:Fixnum 
    from (irb):6 
    from /Users/jeremyburton/.rvm/gems/ruby-1.9.3-p286/gems/railties-4.0.0/lib/rails/commands/console.rb:90:in `start' 
    from /Users/jeremyburton/.rvm/gems/ruby-1.9.3-p286/gems/railties-4.0.0/lib/rails/commands/console.rb:9:in `start' 
    from /Users/jeremyburton/.rvm/gems/ruby-1.9.3-p286/gems/railties-4.0.0/lib/rails/commands.rb:64:in `<top (required)>' 
    from bin/rails:4:in `require' 
    from bin/rails:4:in `<main>' 

此外,要求只能取1個參數似乎很奇怪。看來你應該能夠做到:

params.require(:a, :b).permit(:c, :d) 

然而,你必須做的是:

params.require(:a) 
params.require(:b) 
params.permit(:a, :b, :c, :d) 

這似乎不是很乾 - 如果需要的參數,然後它是由定義允許,當然。

我錯過了什麼嗎?

回答

1

require的意圖是與Rails form_for對象一起使用,其中params散列將包含要包裝表單的對象的名稱。所以像這樣:

ActionController::Parameters.new(person: { name: 'Francesco' }).require(:person) 

在這種情況下,form_for會一直纏着Person對象。因此,.require(:person)將隨後將生成的散列({ name: 'Francesco' })包裝到可響應.permitActionController::Parameters對象中。所以你的測試並不是模仿預期的params用例。

此外,有意義的是require只接受一個參數,因爲您希望爲每個對象類型設置一個唯一的<attribute>_params方法,因爲這些方法同樣也是針對特定對象的包裝。但是,通常只有1個根對象被髮送到表單提交中,並且其中的子對象。

+0

謝謝。這是有道理的。 –