2010-10-21 4 views
2


étrangère Je voudrais savoir de quelle manière est la meilleure pour résoudre ma question:
J'ai une forme afin de sélectionner les personnes via un champ de sélection. Si le nom est manquant dans le champ de sélection, un champ de texte est disponible pour ajouter directement le nom de la personne.
- Le formulaire en new.html.erb est le format de l'action new du contrôleur Team.
- La liste des personnes est extraite du modèle People.champ de sélection, champ texte et la clé

def new
@team = Team.new
@people = People.all
end

J'ai créé un attribut dans le modèle Team pour stocker le champ de texte new_person:

class Team < ActiveRecord::Base
attr_accessor :new_person
...
end

Enfin, voici un extrait de mon point de vue:

<%= f.select :person_id, @people.map { |p| [p.name, p.id] } %>
<%= f.text_field :new_person %>

De toute évidence, je wo Vous souhaitez enregistrer la nouvelle personne dans la table Person avant d'enregistrer les données du formulaire. Comme d'habitude, l'identifiant sont enregistrés au lieu des noms

À ce stade, j'ai deux questions:
1/Le tableau params a la clé new_person ce qui ne dispose pas de la table. Il n'est donc pas possible d'utiliser la méthode Team.new(params[:team]). Existe-t-il une solution facile pour éviter ce problème? 2/Comme j'ai besoin du person_id, comment puis-je l'obtenir quand le nom provient du champ new_person? En utilisant la méthode before_filter?

Merci beaucoup,
Camille.

Répondre

0

1) Vous devriez envisager d'utiliser fields_for dans votre vue dans votre bloc form_for. Cela vous permettra de spécifier que les champs du bloc fields_for sont des attributs d'un modèle différent, généreront les champs de saisie nommés de manière appropriée, et vous permettront d'utiliser params [: team] dans votre contrôleur. Voir le FormHelper documentation pour plus à ce sujet. 2) Pendant que vous pourriez faire quelque chose dans votre contrôleur pour d'abord vérifier une valeur dans le champ new_person, créez l'enregistrement, mettez à jour le contenu de params [: team] avec la valeur de la personne nouvellement créée et créez l'équipe , cela ressemble un peu à un hack pour moi. Une autre solution possible qui pourrait être moins fragile serait d'utiliser du JavaScript sur la page qui rendrait une sorte de boîte de dialogue modale pour l'utilisateur pour créer la nouvelle personne, soumettre la nouvelle personne à la méthode # create controller, puis rafraîchir votre drop vers le bas. Il ne serait probablement pas très difficile de le faire en utilisant un jQuery UI modal form (très bon exemple à ce lien pour faire ce dont vous avez besoin) avec Rails forme distante et JavaScript discret.

Ceci est probablement une solution plus difficile à votre deuxième question que vous espérez, mais probablement plus utile à long terme.

Questions connexes