2010-03-17 4 views
0

J'ai un formulaire dans lequel les utilisateurs peuvent ajouter leurs heures de travail les voir et les éditer (Tout en une page). Lors de l'ajout d'heures de travail, l'utilisateur doit sélectionner un projet dans une liste déroulante. Si l'action ajoute un nouvel enregistrement d'heure, le champ déroulant doit rester vide (non sélectionné) si l'action est en cours d'édition, le champ déroulant doit être sélectionné avec la valeur appropriée. Pour relever ce défi, j'ai écrit le code suivantruby ​​sur rails-Problème avec le formulaire de sélection helper

<% if params[:id].blank?%> 
    <select name="hour[project_id]" id="hour_project_id"> 
     <option value="nil">Select Project</option> 
     <% @projects.each do|project|%> 
      <option value="<%=project.id %>"><%=project.name%></option> 
     <% end%> 
    </select> 
<% else %> 
    <%= select('hour','project_id', @projects.collect{|project|[project.name,project.id]},{:prompt => 'Select Project'})%> 
<% end %> 

Ainsi, en cas d'action de sauvegarde je l'ai fait la liste déroulante uniquement avec html, et en cas d'action d'édition que je l'ai fait avec la méthode Collect. Cela fonctionne bien jusqu'à ce que j'ai essayé de coder les erreurs. Le problème est que lorsque j'utilise la méthode error: validates_presence_of: project_id il ne l'a pas reconnu dans la forme html de la liste déroulante et n'affiche pas le message d'erreur (son fonctionnement uniquement pour la liste déroulante avec la méthode de collecte).

J'apprécie profondément vos instructions et aider à ce sujet

Répondre

1

options_from_collection_for_select (collection, value_method, text_method, selected = nul) est votre ami:

<%= select('hour','project_id', options_from_collection_for_select(@projects, :id, :name, @hour.project_id),{:prompt => 'Select Project'})%> 

Si un objet @hour et il est nouveau et n'a donc pas de project_id la valeur sera nulle et rien ne sera sélectionné - sinon la valeur de @hour sera sélectionnée.

+0

Cela n'a pas fonctionné pour moi. Peut-être parce que toutes mes opérations se font en une seule page. Lorsque l'utilisateur sélectionne le projet et clique sur le bouton de sauvegarde, il est redirigé vers la même page. Lorsque j'ai essayé votre suggestion <% = select ('hour', 'project_id', options_from_collection_for_select (@projets,: id,: nom, @ hour.project_id,), {: prompt => 'Sélectionner un projet'})%> La liste déroulante était toujours sélectionnée. –

+0

J'ai finalement compris mon problème, il semble que dans mon contrôle après avoir effectué l'opération de création, je n'ai pas appelé @ hour = Hour. new alors lorsque la page de formulaire a été rechargée, elle a été rechargée avec Hour.new (params [: hour]). je le change en @ hour = Hour.new et ça marche !!!!!! –

Questions connexes