2009-09-08 7 views
0

J'ai un problème très simple mais je ne trouve pas de solution sympa. J'ai un code de recherche en Ruby (par exemple, les étudiants qui vivent dans un État):RoR Exemple de recherche

# State lookup (id, name) 
class State < ActiveRecord::Base 
    has_many :students 
end 

# Class that belogs to a state 
class Student< ActiveRecord::Base 
    belongs_to :state 
end 

et dans la vue/étudiants/vue new.html.erb, j'afficher les états comme un menu déroulant:

<p> 
    <%= f.label :state %><br /> 
    <%= f.collection_select :state, State.find(:all), 
     :id, :name, :prompt => "Select a State" %> 
    </p> 

jusqu'à présent, si bon, mais quand je frappe sauver je suis arrivé une erreur:

State(#37872860) expected, got String(#21001240) 

ce qui semble raisonnable, que j'envoie une chaîne au lieu d'un objet Etat à la Student.create méthode.

Quelle est la meilleure façon de gérer cela dans RoR? Je récupère l'objet State dans le contrôleur à la main et le remplace dans le hash des paramètres, mais je pense que cela devrait être un meilleur moyen.

Merci beaucoup. Fernando

Répondre

0
<%= f.collection_select :state_id, State.find(:all), :id, :name, :prompt => "Select a State" %> 

:state_id pas :state

+0

Merci JDL, mais j'ai essayé cela et maintenant j'obtiens: la méthode non définie 'state_id' pour # sur l'étape de rendu. – Fernando

+0

Pouvez-vous poster la ligne form_tag de votre vue? – jdl

+0

jdl, merci beaucoup. Le problème était que dans la table de mes étudiants, la colonne d'état s'appelait 'state', pas 'state_id'. Cela fait: state_id fall si référencé dans la vue. Merci à votre indice trouvé le problème dans la table, recréer et maintenant il fonctionne comme vous l'avez dit (f.collection_select: state_id, ... même que c'était). Cordialement; fernando – Fernando

0

State.find (: tout) devrait vraiment être quelque chose qui se passe dans votre contrôleur pas votre vue. Je ne pense même pas qu'il soit possible d'accéder à un modèle dans la vue, ce qui peut être votre problème. Si vous faites quelque chose comme ça dans votre contrôleur:

@states = State.find (: tous)

Ensuite, vous utilisez la variable @states dans la vue:

"Sélectionner un état" %>

J'espère que cela aide.

Questions connexes