2013-05-31 13 views
14

Sto facendo un semplice esercizio con due modelli. Sport e team, definito comeRails - Visualizzazione di riferimenti a chiave esterna in un modulo

 
rails g scaffold sport name:integer 
rails g scaffold team name:integer fans:integer sport:references 

(Nota: La ragione per cui sto usando impalcatura è la prototipazione rapida in modo da poter imparare/sperimentare con le parti che non sono a conoscenza ancora)

Il problema è che il mio "sport" (vale a dire il riferimento chiave esterna) sta mostrando come la seguente enter image description here

Così è ottenuto che strano #<blahl blah> la notazione ad esso ...

<%= form_for(@team) do |f| %> 
    <% if @team.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@team.errors.count, "error") %> prohibited this team from being saved:</h2> 

     <ul> 
     <% @team.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :fans %><br /> 
    <%= f.number_field :fans %> 
    </div> 
    <div class="field"> 
    <%= f.label :sport %><br /> 
    <%= f.text_field :sport %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 

Ho provato a modificare una riga su @team.sport.name ma si è verificato un errore undefined method 'Ice Hockey' for #<Team:0x3e7e040> ... Qualche idea su come visualizzare correttamente il nome da qui ??

risposta

29

Si sta utilizzando un text_field per fare riferimento a un oggetto esistente, uno select con Sport in quanto le opzioni sarebbero più appropriate qui.

Questo è dove deve essere cambiato:

<div class="field"> 
    <%= f.label :sport %><br /> 
    <%= f.text_field :sport %> 
</div> 

A:

<div class="field"> 
    <%= f.label :sport %><br /> 
    <%= f.select :sport_id, options_for_select(Sport.all.map{|s|[s.name, s.id]}) %> 
</div> 

Il f.select genererà una casella di selezione in HTML, le opzioni saranno me tutti gli sport nel DB.

Alcuni documentazione a riguardo:

un modo più pulito sarebbe quella di impostare una variabile @sports nel controllore e chiamare poi nel vostro punto di vista :

# in controller 
def edit 
    @sports = Sport.scoped 
    #... 

# in edit view 
<div class="field"> 
    <%= f.label :sport %><br /> 
    <%= f.select :sport_id, options_for_select(@sports.map{ |s| [s.name, s.id] }) %> 
</div> 

informazioni Aggiuntivo: Se si vuole "pre-select" un'opzione per la selezione, si deve passare come secondo argomento della options_for_select aiutante:

options_for_select(@sports.map{ |s| [s.name, s.id] }, params[:sport_id]) 
# this will select by default the option that matches the value of params[:sport_id] 
+0

Grazie @MrYoshiji . Sto tentando di avviare il tuo primo suggerimento e i valori appaiono correttamente nella casella di selezione. Comunque, sto cercando un 'ActiveModel :: MassAssignmentSecurity :: Error' quando provo a salvare, sta dicendo' Can not mass-assign attributes attributes: sport_id' – Ricky

+2

L'ho fatto lavorando aggiungendo ': sport_id' al mio attr_accessors per the teams_controller. Era questo il modo corretto per farlo? Inoltre, ho provato il secondo metodo, e funziona, ma non capisco perché. Che cosa è "Sport.scoped"? Perché è richiesto solo nel metodo 'edit'? Esempio, anche il metodo 'new' condivide la stessa vista' _form.html.erb', ma non faccio una chiamata a '@sports = Sport.scoped' lì ma funziona ancora ... Grazie per qualsiasi intuizione – Ricky

Problemi correlati