2013-08-19 76 views
11

我将我的rails应用程序(-v3.2.13)转换为rails 4.我使用继承的资源gem的覆盖操作(create!和update!)。参数,但它不创建/更新嵌套属性。我需要允许参数的整个散列。当我尝试时,我得到以下错误。帮助我解决这个问题。Rails 4允许嵌套属性不会创建/更新

PARAMS

 
{"foo"=>{"name"=>"[email protected]", "detail"=>"123", foo1_attributes"=>{"0"=>{"_destroy"=>"", "name"=>"John", "url"=>"johnsmith.blogspot.com",foo2_attributes"=>{"0"=>{"min_time"=>"0", "max_entry"=>"340"}}, "foo3_attributes"=>{"_destroy"=>"", "hours"=>"01", "minutes"=>"00"}, "status"=>"ACTIVE"}}, "foo4_attributes"=>{"0"=>{"image"=>"0","id"=>"1097"}}}, "commit"=>"Save", "foo_id"=>"13", "id"=>"1467"} 

我控制器

def update 
update! do |success, failure| 
    success.html { redirect_to foo_path } 
end 
end 

protected 

def resource_params 
params.permit! 
end 

富型号

​​

跟踪:

Completed 500 Internal Server Error in 3686ms 

ArgumentError (wrong number of arguments (6 for 1..2)): 
    app/controllers/foo_controller.rb:160:in `update' 

protected_attributes (1.0.3) lib/active_record/mass_assignment_security/persistence.rb:60:in `update_attributes' 
inherited_resources (1.3.1) lib/inherited_resources/base_helpers.rb:78:in `update_resource' 
inherited_resources (1.3.1) lib/inherited_resources/actions.rb:45:in `update' 
app/controllers/partner_modules_controller.rb:160:in `update' 
actionpack (4.0.0) lib/action_controller/metal/implicit_render.rb:4:in `send_action' 
actionpack (4.0.0) lib/abstract_controller/base.rb:189:in `process_action' 
actionpack (4.0.0) lib/action_controller/metal/rendering.rb:10:in `process_action' 
actionpack (4.0.0) lib/abstract_controller/callbacks.rb:18:in `block in process_action' 
activesupport (4.0.0) lib/active_support/callbacks.rb:445:in `block (2 levels) in _run__2668227825050344147__process_action__callbacks' 
activesupport (4.0.0) lib/active_support/callbacks.rb:212:in `block in _conditional_callback_around_4134' 
rails-observers (0.1.2) lib/rails/observers/action_controller/caching/sweeping.rb:73:in `around' 
activesupport (4.0.0) lib/active_support/callbacks.rb:283:in `_callback_around_4133' 
activesupport (4.0.0) lib/active_support/callbacks.rb:211:in `_conditional_callback_around_4134' 
activesupport (4.0.0) lib/active_support/callbacks.rb:444:in `block in _run__2668227825050344147__process_action__callbacks' 
activesupport (4.0.0) lib/active_support/callbacks.rb:215:in `_conditional_callback_around_4135' 
activesupport (4.0.0) lib/active_support/callbacks.rb:443:in `_run__2668227825050344147__process_action__callbacks' 
activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks' 
actionpack (4.0.0) lib/abstract_controller/callbacks.rb:17:in `process_action' 
actionpack (4.0.0) lib/action_controller/metal/rescue.rb:29:in `process_action' 
actionpack (4.0.0) lib/action_controller/metal/instrumentation.rb:31:in `block in process_action' 
activesupport (4.0.0) lib/active_support/notifications.rb:159:in `block in instrument' 
activesupport (4.0.0) lib/active_support/notifications/instrumenter.rb:20:in `instrument' 
activesupport (4.0.0) lib/active_support/notifications.rb:159:in `instrument' 
actionpack (4.0.0) lib/action_controller/metal/instrumentation.rb:30:in `process_action' 
actionpack (4.0.0) lib/action_controller/metal/params_wrapper.rb:245:in `process_action' 
activerecord (4.0.0) lib/active_record/railties/controller_runtime.rb:18:in `process_action' 
actionpack (4.0.0) lib/abstract_controller/base.rb:136:in `process' 
actionpack (4.0.0) lib/abstract_controller/rendering.rb:44:in `process' 
actionpack (4.0.0) lib/action_controller/metal.rb:195:in `dispatch' 
actionpack (4.0.0) lib/action_controller/metal/rack_delegation.rb:13:in `dispatch' 
actionpack (4.0.0) lib/action_controller/metal.rb:231:in `block in action' 
actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:80:in `call' 
actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:80:in `dispatch' 
actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:48:in `call' 
actionpack (4.0.0) lib/action_dispatch/journey/router.rb:71:in `block in call' 
actionpack (4.0.0) lib/action_dispatch/journey/router.rb:59:in `each' 
actionpack (4.0.0) lib/action_dispatch/journey/router.rb:59:in `call' 
actionpack (4.0.0) lib/action_dispatch/routing/route_set.rb:655:in `call' 
newrelic_rpm (3.6.6.147) lib/new_relic/rack/error_collector.rb:43:in `call' 
bullet (4.6.0) lib/bullet/rack.rb:13:in `call' 
newrelic_rpm (3.6.6.147) lib/new_relic/rack/error_collector.rb:43:in `call' 
newrelic_rpm (3.6.6.147) lib/new_relic/rack/agent_hooks.rb:22:in `call' 
newrelic_rpm (3.6.6.147) lib/new_relic/rack/browser_monitoring.rb:16:in `call' 
warden (1.2.3) lib/warden/manager.rb:35:in `block in call' 
warden (1.2.3) lib/warden/manager.rb:34:in `catch' 
warden (1.2.3) lib/warden/manager.rb:34:in `call' 
rack (1.5.2) lib/rack/etag.rb:23:in `call' 
rack (1.5.2) lib/rack/conditionalget.rb:35:in `call' 
rack (1.5.2) lib/rack/head.rb:11:in `call' 
remotipart (1.2.1) lib/remotipart/middleware.rb:27:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/params_parser.rb:27:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/flash.rb:241:in `call' 
rack (1.5.2) lib/rack/session/abstract/id.rb:225:in `context' 
rack (1.5.2) lib/rack/session/abstract/id.rb:220:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/cookies.rb:486:in `call' 
activerecord (4.0.0) lib/active_record/query_cache.rb:36:in `call' 
activerecord (4.0.0) lib/active_record/connection_adapters/abstract/connection_pool.rb:626:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:29:in `block in call' 
activesupport (4.0.0) lib/active_support/callbacks.rb:373:in `_run__994999873434308059__call__callbacks' 
activesupport (4.0.0) lib/active_support/callbacks.rb:80:in `run_callbacks' 
actionpack (4.0.0) lib/action_dispatch/middleware/callbacks.rb:27:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/reloader.rb:64:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/remote_ip.rb:76:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:17:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call' 
railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app' 
railties (4.0.0) lib/rails/rack/logger.rb:21:in `block in call' 
activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged' 
activesupport (4.0.0) lib/active_support/tagged_logging.rb:25:in `tagged' 
activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `tagged' 
railties (4.0.0) lib/rails/rack/logger.rb:21:in `call' 
quiet_assets (1.0.2) lib/quiet_assets.rb:18:in `call_with_quiet_assets' 
actionpack (4.0.0) lib/action_dispatch/middleware/request_id.rb:21:in `call' 
rack (1.5.2) lib/rack/methodoverride.rb:21:in `call' 
rack (1.5.2) lib/rack/runtime.rb:17:in `call' 
rack (1.5.2) lib/rack/lock.rb:17:in `call' 
actionpack (4.0.0) lib/action_dispatch/middleware/static.rb:64:in `call' 
railties (4.0.0) lib/rails/engine.rb:511:in `call' 
railties (4.0.0) lib/rails/application.rb:97:in `call' 
rack (1.5.2) lib/rack/content_length.rb:14:in `call' 
thin (1.5.1) lib/thin/connection.rb:81:in `block in pre_process' 
thin (1.5.1) lib/thin/connection.rb:79:in `catch' 
thin (1.5.1) lib/thin/connection.rb:79:in `pre_process' 
thin (1.5.1) lib/thin/connection.rb:54:in `process' 
thin (1.5.1) lib/thin/connection.rb:39:in `receive_data' 
eventmachine (1.0.3) lib/eventmachine.rb:187:in `run_machine' 
eventmachine (1.0.3) lib/eventmachine.rb:187:in `run' 
thin (1.5.1) lib/thin/backends/base.rb:63:in `start' 
thin (1.5.1) lib/thin/server.rb:159:in `start' 
rack (1.5.2) lib/rack/handler/thin.rb:16:in `run' 
rack (1.5.2) lib/rack/server.rb:264:in `start' 
railties (4.0.0) lib/rails/commands/server.rb:84:in `start' 
railties (4.0.0) lib/rails/commands.rb:78:in `block in <top (required)>' 
railties (4.0.0) lib/rails/commands.rb:73:in `tap' 
railties (4.0.0) lib/rails/commands.rb:73:in `<top (required)>' 
script/rails:6:in `require' 
script/rails:6:in `<main>' 
+0

'params.require(:富).permit(:attr_of_foo,:another_attr_of_foo,:foo1_attributes => [:attr_of_foo1,:more_attr_of_foo1] ,等等)'不适合你? – j03w

+0

@ jo3w是的,我尝试了'params.requir(:foo).permit(:name,:detail,foo1_attributes:[:name,:url])',但是我错误的参数数量错误。我需要允许整个散列。我在这里丢失了什么? – Mano

+1

可能的重复http://stackoverflow.com/questions/17371334/how-is-attr-accessible-used-in-rails-4/17371364#17371364 –

回答

4

正如Strong Parameters README所述,您可以使用permit!方法添加到白名单参数的整个哈希如下:

params.require(:foo).permit! 

请记住从链接的README文件中,以下报价执行此操作时:

使用许可证时应特别小心!因为它将允许所有当前和未来的模型属性被批量分配。

+0

它不起作用。即使我得到错误的数量的arumeuments错误。 – Mano

+0

当发生此错误时,您可以在问题中发布完整跟踪吗? – vee

+0

@Mano,是吗?应该有更多,因为我没有看到你正在谈论的错误。 – vee

0

我相信你的resource_params方法应该叫permitted_params。有关如何处理强参数的更多详细信息,请参见the Inherited Resources documentation

+0

我改变了方法名称,因为你说。它不起作用。 – Mano

1

本替换当前的强劲PARAMS:

def permitted_params 
    params.permit(:widget => [:permitted_field, :other_permitted_field]) 
end 

更多信息: ​​

0

我不认为这是相关的错误强烈的参数。在Rails 4.0中,如果一个参数没有列入白名单,它会自动失败并且不会创建该对象。我曾经有过这个错误,我不知道如何解决它,但是你可以发布你的routes.rb文件,并在你的控制器中包含新的和创建的方法?我很确定你的错误是在你的资源嵌套。

4

嗨,你必须使用这种方式:

params.require(:foo).permit( :name, :details, foo1_attributes: [ :_destroy, :name, :url, :id ], foo2_attributes: [ :_destroy, :min_time, :max_entry, :id ] )

它可能会解决你的问题。

+1

这里记住,创建时不需要嵌套属性的id,但是在更新嵌套属性时它是强制性的,否则它会为你创建一个新的副本。这就是为什么我在嵌套属性允许字段中添加id字段 – Akshat

6

我遇到了类似的问题。尝试执行以下操作。假设你需要更新foo1。使用这个强大的参数。

def foo_params 
    params.require(:foo).permit(:foo1_attributes => [:bar1 , :bar2]) 
end 

更新通过。

def update 
    if @foo.update_attributes!(foo_params)  
    redirect_to foo_path 
    else 
    render foo1_edit_path 
    end 
end 
3

这可能有点晚,但我自己只是面对这个。希望它能在一段时间内拯救别人。

使用Rails 4.2。1

与这里的其他答案的问题是,有对的foo1_attributes的价值array他们没有考虑到:

(扩大从OP例子)

foo1_attributes"=> { 
    "0"=> { 
    "_destroy"=>"", "name"=>"John", "url"=>"johnsmith.blogspot.com" 
    } 
} 

正因为如此,你需要permitfoo1_attributesfoo1_attributes[n]

下面是我在我的项目成功implimented类似的功能:

(格式化以上OP的〔实施例)

def resource_params 
    params.require(:foo) 
    .permit(
     :id, 
     :name, 
     :detail, 

     # has_many: :foo1s (Nested Attributes) 
     { foo1_attributes: [ 
      # and the values for each `foo1` in `foo1_attributes` 
      [ 
      :name, 
      :url 
      ] 
     ]}, 

     # has_many: :foo2s (Nested Attributes) 
     { foo2_attributes: [ 
      # and the values for each `foo2` in `foo2_attributes` 
      [ 
      :min_time, 
      :max_entry 
      ] 
     ]} 

     # etc... 
    ) 

其他一些要注意的事情......