L'association fonctionne bien puisque je peux jouer avec elle sur IRB. Aussi je peux éditer livres existants pour ajouter des étiquettes, mais je ne peut pas créer et attribuer une étiquette en même temps (erreur de validation "Tags est invalide"). Je suppose que c'est une question de forme/contrôleur, je pense que je dois le construire mais je ne peux pas comprendre comment.Formulaire de sélection multiple sur des associations polymorphes de rails
## Tag model (:tags)
belongs_to :genre
belongs_to :taggable, polymorphic: true
## Genre model (:genres)
has_many :tags
has_many :taggables, through: :tags
## Serie model (:series)
has_many :tags, as: :taggable, dependent: :destroy
has_many :genres, through: :tags
## Book model (:books)
has_many :tags, as: :taggable, dependent: :destroy
has_many :genres, through: :tags
Series_Controller
before_action :select_genre
[...]
def new
@series = current_user.series.build
end
def edit
end
def create
@serie = current_user.series.build series_params
@serie.save
redirect_to admin_series_path
end
end
[...]
# Useful
def select_genre
@genres = Genre.all
end
Formulaire
<select name="serie[genre_ids][]" multiple="multiple">
<% @series.each do |serie| %>
<option value="<%= serie.id %>"><%= serie.name %></option>
<% end %>
</select>
Edit: Merci @Fabrizio Bertoglio, il fonctionne très bien pour les options simples mais je ne pouvais pas faire ça marche pour plusieurs genres.
# SERIES CONTROLLER
def new
@series = current_user.series.build
@series.tags.build
end
# PARAMS
params.require(:serie).permit ...... tags_attributes: [ :genre_id ]
# GENRE MODEL
** adding 'optional: true' to 'belongs_to :taggable' **
Formulaire
<select name="serie[tags_attributes][0][genre_id]">
<% @series.each do |serie| %>
<option value="<%= serie.id %>"><%= serie.name %></option>
<% end %>
</select>
Comme je l'ai dit avant que cela fonctionne bien, mais si j'échange genre_id
avec genre_ids
il arrêter de travailler permettant à la place l'utilisateur de sélectionner des genres multiples et créer plusieurs tags.
# CONTROLLER
params.require(:serie).permit ...... tags_attributes: [ { genre_ids: [] } ]
# FORM
<select name="serie[tags_attributes][0][genre_ids][]" multiple="multiple">
S'il vous plaît également montrer la définition de la méthode 'series_params' – bitsapien