11
votes

Rails 4 permis Les attributs imbriqués ne créent pas / mise à jour

Je convertitons mon application Rails (-v3.2.13) aux rails 4.J'ai utilise les actions d'écrasement des ressources héritées de ressources (Créer! et mettre à jour!). Je permets tout le hasch des paramètres, mais cela ne crée pas / met à jour le Attributs imbriqués.Je besoin de permettre à l'ensemble du hachage des paramètres. Quand j'ai essayé, je reçois l'erreur suivante.Help me pour résoudre ceci.

params p>

 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>'


3 commentaires

Params.Require (: FOO) .permit (: attr_of_foo,: un autre_attr_of_foo,: FOO1_ATtributes => [: attr_of_foo1,: plus_attr_of_foo1], .. / code> ne fonctionne pas pour vous?


@ jo3w oui, j'ai essayé avec param.requir (: foo) .permit (: nom ,: détail, foo1_attributes: [: nom ,: url]) , mais je me trompe d'erreur d'arguments .Je besoin de permettre à l'ensemble de Hash.am je manque quelque chose ici?


Duplicailler possible de Stackoverflow.com/Questtions/17371334/...


7 Réponses :


4
votes

Comme indiqué dans le paramètres solides README , vous pouvez utiliser le Permis! Code> Méthode de WHITELIST L'ensemble du hachage de paramètres suivants:

params.require(:foo).permit!


5 commentaires

Ça ne marche pas.still je me trompe d'erreur de nombre d'arguments.


Pouvez-vous poster la trace complète dans votre question lorsque cette erreur se produit.


@Mano, est-ce que c'est? Il devrait y avoir plus que je ne vois pas l'erreur dont vous parlez.


@Mano, s'il vous plaît essayez appeler update! avec Resource_params paramètre, c'est-à-dire une action de mise à jour do mise à jour! (Ressources_params) FAIT | succès, échec |


Oh mon Dieu merci! J'ai écrit un permis sans fin (.....) appelle des modèles totalement non critiques pour trop longtemps. Je ne savais pas que c'était si facile!



0
votes

Je crois que votre ressource_params doit être appelé autorisé_params . Plus de détails sur la façon de gérer les paramètres solides sont dans La documentation des ressources héritées .


0 commentaires

1
votes

Remplacez vos paramètres solides actuels avec ceci:

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


0 commentaires

0
votes

Je ne pense pas que ce soit une erreur de paramètre solide. Dans Rails 4.0, si un paramètre n'est pas blanchi, il échoue silencieusement et l'objet n'est pas créé. J'ai eu cette erreur un moment et je ne suis pas exactement comment le réparer, mais pouvez-vous publier votre fichier routes.rb et inclure les nouvelles méthodes de création de votre contrôleur? Je suis sûr que votre erreur est dans votre nidification de ressources.


0 commentaires

5
votes

Bonjour, vous devez l'utiliser de cette façon:

param.require (: foo) .permit ( : Nom ,: Détails, FOO1_ATtributes: [: _Destroy ,: Nom ,: URL ,: ID], FOO2_ATtributes: [: _Destroy ,: Min_Time ,: max_Entry ,: id] )

Cela peut résoudre votre problème.


1 commentaires

Ici, rappelez-vous que l'ID d'attributs imbriqués n'est pas nécessaire en cas de création, mais il est obligé de mettre à jour des attributs imbriqués, sinon cela en créera une nouvelle copie pour vous. C'est pourquoi j'ai ajouté le champ ID dans les attributs imbriqués



6
votes

J'ai fait face à un type de problème similaire. Essayez de faire ce qui suit. En supposant que vous devez mettre à jour FOO1. Utilisez ceci pour vos paramètres puissants.

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


0 commentaires

4
votes

Cela peut être un peu en retard, mais je viens de faire face à cela moi-même. Espérons que cela sauvera quelqu'un d'autre un peu de temps.

à l'aide de rails 4.2.1

Le problème avec les autres réponses Voici qu'ils ne prennent pas en compte qu'il existe un tableau pour la valeur de foo1_attributes :

(exemple expansé de OP) xxx

à cause de Ceci, vous devez permis foo1_attributes et foo1_attributes [n]

Voici comment j'ai impliqué avec succès des fonctionnalités similaires dans Mon projet:

(formé à l'exmaple d'OP au-dessus) xxx

quelques autres choses à noter ...


0 commentaires