2016-07-21 2 views
0

die Event wird gespeichert, aber mit "artists":[] leer, auch wenn ich mehrere Künstler in der neuen Form ausgewählt. der relevante Teil der neuen Form sieht wie folgt aus:Speichern Array-Ausgabe in eine Join-Tabelle (unerlaubter Parameter)

<%= f.fields_for :event_artists do |fea| %> 
    <%= fea.collection_select :artist_id, Artist.all, "id", "name", {include_blank: true}, {multiple: true} %> 
    <% end %> 

das Protokoll:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"OEh0j/cp35s/FABhsETxeQKnqZCKXrbZMpeeEE6P+KSM3QVF94zIluB1rqAD65ci5CP+R6tQS8V1f3SXIQ6Vtw==", "event"=>{"name"=>"", "date(1i)"=>"2016", "date(2i)"=>"7", "date(3i)"=>"22", "date(4i)"=>"01", "date(5i)"=>"55", "description"=>"", "venue_id"=>"1", "event_artists_attributes"=>{"0"=>{"artist_id"=>["", "1", "2"]}}}, "commit"=>"Create"} 
Unpermitted parameter: artist_id 

hier wird dieser Parameter in der

Controller erlaubt ist
def event_params 
    params.require(:event).permit(:id, :name, :date, :venue_id, :description, { event_artists_attributes: [:artist_id] }) 
end 

event_artist Modell sieht wie folgt aus :

class EventArtist < ApplicationRecord 
    belongs_to :event, optional: true 
    belongs_to :artist 
end 

Ereignismodell:

class Event < ApplicationRecord 
    belongs_to :venue 
    has_many :event_artists 
    has_many :artists, through: :event_artists 
    accepts_nested_attributes_for :event_artists, reject_if: :all_blank, allow_destroy: true 

end 

Ereignissteuerung:

def create 
    @event = Event.new(event_params) 

    if @event.save 
     render json: @event, status: :created, location: @event 
    else 
     render json: @event.errors, status: :unprocessable_entity 
    end 
    end 

    def new 
    @event = Event.new 
    @artist = @event.event_artists.build 
    end 

Antwort

1

Sie haben event_artists_attributes innerhalb eines unnötigen Hash. Verwenden Sie stattdessen:

params.require(:event).permit(:id, :name, :date, :venue_id, :description, event_artists_attributes: [artist_id]) 

Aber Sie haben ein anderes Problem. Sie versuchen, mehrere Interpreten-IDs auf einem EventArtistbelongs_to nur einem Artist festzulegen. Da Sie eine has_many artists, through: :event_artists auf Ihrem Event Modell haben, können Sie Folgendes ändern:

Controller:

def event_params 
    params.require(:event).permit(:id, :name, :date, 
           :venue_id, :description, artist_ids: []) 
end 

und in der Form, entfernen Sie den <%= fields_for… Block und ersetzen Sie es mit:

<%= f.collection_select :artist_ids, Artist.all, "id", "name", 
          {include_blank: true}, {multiple: true} %> 
+0

hmm, immer noch unerlaubter Fehler – sivanes

+0

Können Sie Ihren vollständigen Params-Hash ausgeben? –

+0

den Post aktualisiert – sivanes

0

Try this:

params.require(:event).permit(:id, :name, :date, :venue_id, :description, { event_artists_attributes: [artist_id: []] }) 
+0

nicht Arbeiten. im Browser: '{" event_artists.artist ": [" muss existieren "]}', in der Konsole '(0.2ms) ROLLBACK [Active_Model_serializers] Gerendert ActiveModel :: Serializer :: Null mit ActiveModel :: Errors (0.35ms) Abgeschlossen 422 Unprocessable Entity ' – sivanes

+0

Das würde auf Ihr leeres Element im ID-Array zurückzuführen sein. Sie sollten '{include_blank: true}' in Ihrer Sammlung entfernen auswählen. – Ivan

Verwandte Themen