2017-09-20 8 views
0

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"> 
+0

S'il vous plaît également montrer la définition de la méthode 'series_params' – bitsapien

Répondre

0

Vous devez suivre ces instructions pour building complex forms.

De cette façon, vous pouvez créer un formulaire qui a les valeurs d'entrée pour la création @serie, mais aussi pour créer @serie.tags.

Vous devez lire ce guide, mais dans la synthèse que vous devez faire les 3 étapes suivantes:

  1. Configurer le modèle et permettre nested_attributes
  2. Construire un emboîtées
  3. Dans le contrôleur, configurer vos params forts pour l'objet imbriqué
  4. Instanciez la variable @serie dans le contrôleur avec vos strong_params, afin qu'il crée l'objet associé
+0

pourriez-vous jeter un oeil sur mon édition? – user8638523