2016-04-19 8 views
1

Ich habe eine verschachtelte simple_form, und ich verwende den Edelstein Kokon. Ich habe ein Challenge-Modell, das dies in challenge.rb hat: accepts_nested_attributes_for :prizes Und eine Herausforderung has_many Preise. Beim Abschicken des Formulars erhalte ich den Fehler:Verschachtelte Formulare mit Kokon: Berechtigungsproblem

Auch wenn ich es in meinen starken params autorisiert habe. Ich habe Kokon schon vorher benutzt und es geschafft, es funktioniert, ich kann das Problem hier nicht finden und ich ziehe mir die Haare aus.

In meinem challenges_controller.rb:

def create 
    @challenge = Challenge.create(challenge_params) 
    @challenge.user = current_user 
    authorize @challenge 

    if params["challenge"]["prizes_attributes"] 
     for k,v in params["challenge"]["prizes_attributes"] 
     @prize = Prize.create 
     @prize.challenge = @challenge 
     @prize.title = v.values[0].values[0] 
     @prize.save 
     end 
    end 

    if @challenge.save 
     redirect_to challenge_path(@challenge) 
    else 
     render :new 
    end 
    end 

def challenge_params 
    params.require(:challenge).permit(:title, 
             :banner, 
             :user, 
             :start_date, 
             :end_date, 
             :tagline, 
             :slug, 
             :rules, 
             :category_id, 
             :organization, 
             prizes_attributes: [:id, :title]) 
    end 

Auch in meiner Form eine Herausforderung zu schaffen:

<%= simple_form_for @challenge do |f| %> 
     <%= f.error_notification %> 
     <div class="form-inputs"> 
      <%= f.input :title, :label => "Titre" %> 
      <%= f.input :banner, :label => "Bannière", as: :attachinary %> 
      <%= f.input :tagline, :label => "Tagline" %> 
      <%= f.input :organization, :collection => @organizations,:label => "Organization", :include_blank => true%> 
      <%= f.input :rules, :label => "Lien vers le règlement" %> 
      <%= f.input :start_date, as: :string, input_html: {type: :date}, :label => "Date de début" %> 
      <%= f.input :end_date, as: :string, input_html: {type: :date}, :label => "Date de fin" %> 
      <%= f.input :category_id, :collection => @ancestors,:label => "Catégorie", :include_blank => true%> 
      <%= f.simple_fields_for :prizes do |p| %> 
       <%= render 'prize_fields', f: p %> 
      <% end %> 
      <%= link_to_add_association 'Ajouter un prix', f, :prizes %> 
     </div> 
     <div class="form-actions text-center"> 
      <%= f.button :submit, "Soumettre", :class => "btn btn-primary" %> 
     </div> 
     <% end %> 

Und in meinem prizes_fields Teil:

<li> 
    <div class='row'> 
    <%= f.fields_for :prizes do |p| %> 
    <div class='col-xs-12 col-md-6'> 
     <div class="materiel-wrapper"> 
     <%= p.text_field :title, class:"form-control", placeholder:"Titre" %> 
     </div> 
    </div> 
    <% end %> 
    </div> 
</li> 

Hat jemand sehen wo habe ich einen Fehler gemacht?

Vielen Dank für Ihre Zeit und helfen

Antwort

1
@challenge = Challenge.create(challenge_params) 

Dadurch werden die verschachtelten Preis params in die Schöpfung Pass für Sie, die Sie nicht manuell analysieren müssen.

Create versuchen, den Datensatz zu speichern, da Sie das Objekt ändern und später speichern möchten Sie möglicherweise .new hier statt erstellen verwenden.

Ihr Formular dupliziert den fields_for Anruf, der dazu führen kann, dass schlechte Params durchkommen.

Sie haben f.simple_fields_for :prizes do |p| in Ihrer Sicht, so dass Sie es nicht in der partiellen brauchen. Nehmen Sie es aus der partiellen und ändern Sie die teilweise zu verwenden f.text_field anstelle von p.

+0

Vielen Dank für Ihre Antwort! Wenn ich jedoch die f.simple_fields_for: Preise lösche | p | im partiellen habe ich "undefined method text_field für nil" –

+1

@GrahamSlick Das liegt daran, dass Sie 'p' aufrufen, aber Sie haben es an das Partielle als' f' übergeben ('<% = render 'price_fields', f: p %> '). Ändern Sie Ihre Partial zu 'f.text_field' – Matt

+1

Vielen Dank, es hat funktioniert! –

Verwandte Themen