0

Unpermitted parameter est affiché lorsque j'essaie de créer de nouvelles données. Althogh il y a beaucoup de questions similaires, je ne peux pas savoir comment résoudre.Rails4: Paramètre non autorisé avec utilisation d'attributs imbriqués

Ce que je voudrais faire est d'enregistrer la valeur dans la table amounts lors de la création schedule.

journal

Processing by SchedulesController#create as HTML 
    Parameters: {"utf8"=>"?", "authenticity_token"=>"xxx", "schedule"=>{"title"=>"test title", "departure_date"=>"2016-07-06", "rooms_attributes"=>{"0"=>{"schedule_id"=>"", "amounts_attributes"=>{"0"=>{"schedule_id"=>"", "room_id"=>""}}}}}, "commit"=>"Create my schedule"} 
    Parameters: {"utf8"=>"?", "authenticity_token"=>"xxx", "schedule"=>{"title"=>"test title", "departure_date"=>"2016-07-06", "rooms_attributes"=>{"0"=>{"schedule_id"=>"", "amounts_attributes"=>{"0"=>{"schedule_id"=>"", "room_id"=>""}}}}}, "commit"=>"Create my schedule"} 
    User Load (120.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
    User Load (120.7ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT 1 [["id", 1]] 
Unpermitted parameter: amounts_attributes 

modèles

schedule.rb

class Schedule < ActiveRecord::Base 
    belongs_to :user 
    has_many :rooms, inverse_of: :schedule, dependent: :destroy 
    has_many :amounts, inverse_of: :schedule, dependent: :destroy 
    accepts_nested_attributes_for :rooms, allow_destroy: true 
    accepts_nested_attributes_for :amounts, allow_destroy: true 

rooms.rb

class Room < ActiveRecord::Base 
    belongs_to :schedule, inverse_of: :rooms 
    has_many :events, inverse_of: :room, dependent: :destroy 
    has_many :amounts, inverse_of: :room, dependent: :destroy 
    accepts_nested_attributes_for :events, allow_destroy: true 
    accepts_nested_attributes_for :amounts, allow_destroy: true 

amount.rb

class Amount < ActiveRecord::Base 
    belongs_to :schedule, inverse_of: :amounts 
    belongs_to :room, inverse_of: :amounts 
    belongs_to :event, inverse_of: :amounts 
end 

contrôleur

schedule_controller.rb

def new 
    @schedule = Schedule.new 
    room = @schedule.rooms.build 
    room.amounts.build 
    end 

    def create 
    @schedule = current_user.schedules.build(schedule_params) 
    if @schedule.save 
     flash[:success] = "schedule created!" 
     redirect_to schedule_path(@schedule) 
    else 
     render 'new' 
    end 
    end 

... 

    def schedule_params 
    params.require(:schedule).permit(
     :title, :departure_date, 
     rooms_attributes: [ 
     :id, :_destroy, :room, :room_address, :schedule_id, :day, 
     amounts_attributes: [ 
      :schedule_id, :room_id, :event_id, :id, :_destroy, :ccy, :amount 
     ] 
     ] 
    ) 
    end 

vue

/schedules/new.html.erb

... 
<%= form_for(@schedule) do |f| %> 
    <%= render 'schedule_form', f: f %> 
    <%= f.submit "Create my schedule", class: "btn btn-primary" %> 
... 

/horaires/_schedule_form.html.erb

Il fonctionne avant d'ajouter 4 lignes pour <%= room.fields_for(:amounts) do |amount| %>.

... 
    <%= f.label :title %> 
    <%= f.text_field :title, class: 'form-control' %> 
... 

<%= f.fields_for(:rooms) do |room| %> 
    <%= room.hidden_field :schedule_id %> 

    <%= room.fields_for(:amounts) do |amount| %> # my app works before add these 4 lines. 
    <%= amount.hidden_field :schedule_id %> # 
    <%= amount.hidden_field :room_id %>  # 
    <% end %>         # 

<% end %> 

Je vous serais reconnaissant de bien vouloir me faire part de vos suggestions.

+0

Vous ne disposez pas d'un: schedule_id dans vos paramètres forts pour les montants_attributs, mais vous le passez comme paramètre – hypern

+0

Merci pour votre commentaire, @hypern. J'ai échoué à copier et coller. Je mets à jour le paramètre fort dans 'schedule_controller.rb'. – SamuraiBlue

Répondre

0

Vous n'avez pas fermé le paramètre de tableau room_attributes.Veuillez le fermer et ouvrez les paramètres imbriqués de l'attribut amount. Également le schedule_id dans les attributs du montant.

def schedule_params 
     params.require(:schedule).permit(:title, 
     :departure_date,{rooms_attributes: [:id, :_destroy, :room, :room_address, :schedule_id, :day, 
     { amounts_attributes: [:itinerary_id, :room_id, :event_id, :id, :_destroy, :ccy, :amount]} 
     ]} 
     ) 
end 
+0

Merci pour votre réponse, @Sravan. Bien que j'aie essayé votre réponse, l'erreur suivante est affichée. 'SyntaxError (/home/ubuntu/workspace/app/controllers/schedules_controller.rb:83: erreur de syntaxe, inattendue ']', s'attendant à ')'' – SamuraiBlue

+0

votre problème est-il résolu maintenant? En fait, j'ai mal compris la demande. Maintenant, je change la réponse – Sravan

+0

Non, cela ne résout pas. J'ai toujours la même erreur 'Paramètre non autorisé: quantités_attributs'. – SamuraiBlue

0

Après des params enregistrés, votre amounts_attributes est un tableau d'objets et doivent être déclarés en tant que tel dans votre argument de méthode permit:

def schedule_params 
    params.require(:schedule).permit(
     :title, :departure_date, 
     rooms_attributes: [{ 
     :id, :_destroy, :room, :room_address, :schedule_id, :day, 
     amounts_attributes: [{ 
      :itinerary_id, :room_id, :event_id, :id, :_destroy, :ccy, :amount 
     }] 
     }] 
    ) 
end 

La rooms_attributes suit une structure similaire et doit être corrigée en bien.

Jetez un oeil à l'exemple de paramètres imbriqués dans ActionController::Parameters docs.

+0

Merci pour votre réponse, @Nic Nilov. L'erreur de syntaxe a été affichée lorsque j'ai ajouté le support bouclé. – SamuraiBlue

0

Je pense que votre params devrait ressembler à ceci:

def schedule_params 
    params.require(:schedule).permit(
     :title, :departure_date, 
     rooms_attributes: [ 
     :id, :_destroy, :room, :room_address, :schedule_id, :day, 
     amounts_attributes: [ :id, :_destroy, 
      :itinerary_id, :room_id, :event_id, :id, :_destroy, :ccy, :amount] 
] 
) 
end 

Alors, pour votre modèle imbriqué, même si elle est profondément imbriqué, vous devez toujours: id et: _destroy. Laissez-moi savoir comment cela se passe pour vous.

+0

Merci pour votre réponse, @nilatti. Quand j'ai changé les 'montants_attributs' comme follwoings,' Paramètre non autorisé' est disparu. 'amount_attributes: [: id,: _destroy,: itinéraire_id,: id_de_module,: id_événement,: ccy,: montant]'. J'ai déjà ': id,: _destroy,' dans 'amount_attributes'. J'ai donc changé la position de ces deux. Mais 'itinéraire_id' n'a pas encore été enregistré. Avez-vous une idée? – SamuraiBlue

+0

Cela peut sembler un peu stupide, mais je ne vois pas où dans votre formulaire vous définissez un itinéraire. – nilatti

+0

Merci pour votre commentaire, @nilatti. Je suis désolé d'avoir fait une faute de frappe. J'ai changé 'itinéraire_id' en' schedule_id' dans 'amount_attributes'. Bien que 'schedule_id' soit également utilisé dans les rooms_attributes, il peut être sauvegardé dans la table des pièces. – SamuraiBlue