2009-05-13 7 views
1

J'ai un formulaire avec 2 options de sélection - fréquence et durée. Lorsque le formulaire comporte des erreurs et qu'il est renvoyé au navigateur, les options de sélection ne sont pas remplies avec les sélections effectuées par l'utilisateur même si les valeurs renvoyées pour ces zones correspondent aux valeurs des options des sélections. En outre, lorsque le formulaire est renvoyé, ces champs ne sont pas marqués comme ayant des erreurs même si leurs valeurs sont vides.Problèmes de remplissage des options de sélection dans Rails lorsque le formulaire renvoie des erreurs

est ici les champs de fréquence et de durée dans Rails

<%= frequency_select c, :frequency %> 
<%= duration_select c, :duration %> 

La méthode de frequency_select est-

def frequency_select(f, method) 
    options = [["day", 1.day], ["other day", 2.days], ["week", 1.week]] 
    f.select method, options, :include_blank => true 
end 

Et la méthode pour duration_select est

def duration_select(f, method, unit="day") 
    values, units = *case unit 
     when "day" : [[[5, 5], [15, 15], [30, 29]], "days"] 
     when "other day" : [[[15, 15], [30, 29], [45,45]], "days"] 
     when "week" : [[[4, 29], [6, 43], [8, 57]], "weeks"] 
    end 
    f.select method, values.map {|(label, i)| ["#{label} #{units}", i.days]}, :include_blank => true 
end 

Si vous entrez une valeur dans l'un ou l'autre de ces champs et soumettre le formulaire sans remplir une partie de Dans le cas contraire, le formulaire est renvoyé à l'utilisateur (comme prévu), mais les champs de durée et de fréquence ne sont pas remplis avec la sélection de l'utilisateur.

Si j'ajoute ce bit de code à la forme

<p><%= @challenge.attributes.inspect %></p> 

Je vois que cela pour la durée et la fréquence lorsque le formulaire est retourné au navigateur:

"duration"=>3888000, "frequency"=>172800 

Ces valeurs correspondent à des valeurs sur les options dans les champs de sélection.

Y at-il quelque chose de spécial dans Rails qui doit être fait pour que les champs de sélection soient remplis avec les sélections de l'utilisateur? Des pensées sur ce que le problème pourrait être ou ce que je devrais essayer ensuite?

L'aide est grandement appréciée!

-Rick

PS Si vous regardez quelques-unes des autres questions, vous remarquerez que j'ai demandé à ce sujet dans le passé. À un moment donné, je pensais que le formulaire renvoyait des valeurs de fréquence et de durée en jours plutôt qu'en secondes, mais ce n'est pas le cas. PPS Voici un autre élément d'information qui pourrait avoir de l'importance, mais mes tests indiquent que ce n'est probablement pas le cas. (Cependant, je suis un peu novice à cela, alors ne me croyez pas sur parole.)

Ces deux champs sont chaînés ensemble en utilisant le plugin jquery en cascade.

Le javascript est inclus sur la page (pas dans un fichier séparé) et une partie du js est en cours de création par Rails. D'abord, voici les scripts tels qu'ils apparaissent dans le navigateur. Le premier est le script pour générer les options pour la sélection de durée et le second est le script requis par le plugin Cascade pour déclencher le chaînage de champ.

<script type="text/javascript"> 
    var list1 = [ 
     {'When':'86400','Value':' ','Text':' '}, 
     {'When':'172800','Value':' ','Text':' '}, 
     {'When':'604800','Value':' ','Text':' '}, 
     {'When':'86400','Value':'432000','Text':'5 days'}, 
     {'When':'86400','Value':'1296000','Text':'15 days'}, 
     {'When':'86400','Value':'2505600','Text':'30 days'}, 
     {'When':'172800','Value':'1296000','Text':'15 days'}, 
     {'When':'172800','Value':'2505600','Text':'30 days'}, 
     {'When':'172800','Value':'3888000','Text':'45 days'}, 
     {'When':'604800','Value':'2505600','Text':'4 weeks'}, 
     {'When':'604800','Value':'3715200','Text':'6 weeks'}, 
     {'When':'604800','Value':'4924800','Text':'8 weeks'} 
    ]; 

    function commonTemplate(item) { 
     return "<option value='" + item.Value + "'>" + item.Text + "</option>"; 
}; 

function commonMatch(selectedValue) { 
     return this.When == selectedValue; 
}; 
</script> 

<script type="text/javascript"> 
    jQuery(document).ready(function(){ 
     jQuery("#challenge_duration, #user_challenge_duration").cascade("#challenge_frequency, #user_challenge_frequency",{ 
      list: list1,    
      template: commonTemplate, 
      match: commonMatch   
     }) 
    }); 
</script> 

Et voici un peu du premier script tel qu'il est dans le fichier erb - vous voyez qu'une partie du script est généré par Rails

<%= 
    [ [1.day, [[5, 5], [15,15], [30, 29]], "days"], 
    [2.days, [[15, 15], [30, 29], [45, 45]], "days"], 
    [1.week, [[4, 29], [6, 43], [8, 57]], "weeks"]].map do |(frequency, durations, unit)| 

    durations.map do |(label, value)| 
     "{'When':'#{frequency}','Value':'#{value.days}','Text':'#{label} #{unit}'}" 
    end 
    end.join(",\n") 
-%> 

Maintenant, la raison pour laquelle je don « t pense qu'il importe de savoir si la durée est généré avec JS est

  1. le problème existe toujours si je retire tous les JS
  2. le problème affecte également t il champ de fréquence, dont les options ne sont pas générés par la JS

Répondre

0

Permet de test pour frequency_select premier Modifier le code de vue que suivre,

<%= frequency_select @challenge, :frequency %> 

Changement méthode d'assistance pour frequency_select à,

def frequency_select(objct, method) 
    options = [["day", 1.day], ["other day", 2.days], ["week", 1.week]] 
    select objct, method, options, :include_blank => true 
end 
Questions connexes