128 votes

Rails de 4 paramètres illicite attributs imbriqués

Je suis nouveau sur le RoR, mais ont décidé que je peut tout aussi bien apprendre sur 4. Cela peut ou peut ne pas être une bonne idée. Je suis en train de créer un formulaire en utilisant des attributs et j'ai du mal.

J'ai regardé ce railscast http://railscasts.com/episodes/196-nested-model-form-part-1 et je suis en train de recréer une situation similaire à la mienne.

J'ai un projet de Loi objet qui a de nombreuses en Raison des objets. La Cause de l'objet appartient aussi à une Personne. Je veux un formulaire où je peux créer le projet de Loi et de ses enfants, les Cotisations de tous dans une seule page.

Les champs appropriés sont affichés sur la page (mais sans une liste déroulante pour Personne encore) et de le soumettre est réussie. Cependant, aucun des enfants n'cotisations sont enregistrées dans la base de données et une erreur est générée dans le journal du serveur:

Non autorisé paramètres: dues_attributes

Il y a eu une sorte de changement dans les Rails 4, ou suis-je en manquant quelque chose de complètement.

Juste avant l'erreur, le journal affiche ceci:

A commencé à publier des "factures" pour 127.0.0.1 à 2013-04-10 00:16:37 -0700 Le traitement par BillsController#créer en HTML
Paramètres: {"utf8"=>"✓", "authenticity_token"=>"ipxBOLOjx68fwvfmsMG3FecV/q/hPqUHsluBCPN2BeU=", "projet de loi"=>{"société"=>"Comcast", "mois"=>"avril ", "annee"=>"2013", "dues_attributes"=>{"0"=>{"montant"=>"30", "person_id"=>"1"}, "1"=>{"montant"=>"30", "person_id"=>"2"}, "2"=>{"montant"=>"30", "person_id"=>"3"}}}, "commettre"=>"Créer un projet de Loi"}



Code correspondant est indiqué ci-dessous

en raison.rb

class Due < ActiveRecord::Base
    belongs_to :person
    belongs_to :bill
end


le projet de loi.rb

class Bill < ActiveRecord::Base
    has_many :dues, :dependent => :destroy 
    accepts_nested_attributes_for :dues, :allow_destroy => true
end


bills_controller.rb

  # GET /bills/new
  def new
      @bill = Bill.new
      3.times { @bill.dues.build }
  end


factures/_form.html.erb

  <%= form_for(@bill) do |f| %>
    <div class="field">
        <%= f.label :company %><br />
        <%= f.text_field :company %>
    </div>
    <div class="field">
        <%= f.label :month %><br />
        <%= f.text_field :month %>
    </div>
    <div class="field">
        <%= f.label :year %><br />
        <%= f.number_field :year %>
    </div>
    <div class="actions">
        <%= f.submit %>
    </div>
    <%= f.fields_for :dues do |builder| %>
        <%= render 'due_fields', :f => builder %>
    <% end %>
  <% end %>


factures/_due_fields.html.erb

<div>
    <%= f.label :amount, "Amount" %>        
    <%= f.text_field :amount %>
    <br>
    <%= f.label :person_id, "Renter" %>
    <%= f.text_field :person_id %>
</div>

Mise à JOUR bills_controller.rb: Cela fonctionne!

def bill_params 
    params.require(:bill).permit(:company, :month, :year, 
                                 dues_attributes: [:amount,
                                                   :person_id]) 
end

189voto

thorsten müller Points 3518

Semble qu'il y ait un changement dans le traitement de l'attribut de protection et de maintenant, vous devez la liste blanche params dans le contrôleur (au lieu de attr_accessible dans le modèle) parce que la première option gem strong_parameters est devenu une partie de la voie de Base.

Cela devrait ressembler à quelque chose comme ceci:

class PeopleController < ActionController::Base
  def create
    Person.create(person_params)
  end

private
  def person_params
    params.require(:person).permit(:name, :age)
  end
end

Donc, params.require(:model).permit(:fields) serait utilisé pour le imbriqués les attributs de quelque chose comme params.require(:person).permit(:name, :age, pets_attributes: [:id, :name, :category])

Plus de détails peuvent être trouvés dans le Ruby bord de l'API docs et strong_parameters sur github ou ici

23voto

Leahcim Points 5965

À partir de la documentation

To whitelist an entire hash of parameters, the permit! method can be used

params.require(:log_entry).permit!

Imbriqués les attributs sont sous la forme d'un hash. Dans mon application, j'ai une Question.rb modèle accepter imbriqués les attributs pour une Réponse.rb modèle (où l'utilisateur crée les choix de réponses pour une question, qu'il crée). Dans le questions_controller, j'ai fais ce

  def question_params

      params.require(:question).permit!

  end

Tout est dans la question de hachage est permis, y compris imbriquée réponse attributs. Cela fonctionne aussi si le imbriqués les attributs sont sous la forme d'un tableau.

Cela dit, je me demande si il y a un problème de sécurité avec cette approche, car fondamentalement, ça permet de tout ce qui est à l'intérieur de la table de hachage, sans préciser exactement ce qu'il est, ce qui semble contraire à l'objectif de forte paramètres.

20voto

Amit Agarwal Points 25

ou vous pouvez simplement utiliser

13voto

En fait, il existe un moyen à juste blanc-liste paramètres tous imbriqués.

Cette méthode a l’avantage sur d’autres solutions. Il permet d’autoriser les paramètres profondément imbriquées.

Alors que les autres solutions comme :

Ne pas.


Source :

https://github.com/rails/rails/issues/9454#issuecomment-14167664

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X