2013-05-31 8 views
14

Wykonuję proste ćwiczenie z dwoma modelami. Sport i zespołów, zdefiniowana jakoSzyny - Wyświetlanie informacji o kluczach obcych w formularzu

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

(Uwaga: Przyczyną Używam rusztowanie szybko prototypów więc mogę się nauczyć/eksperyment z częściami nie jestem zaznajomiony z jeszcze)

Problem jest to, że mój „sport” (czyli referencji klucza obcego) pokazuje jak na poniższym enter image description here

Więc to musi to dziwne #<blahl blah> notacja do niego ...

<%= 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 %> 

Próbowałem zmienić jedną linię na @team.sport.name, ale powoduje błąd undefined method 'Ice Hockey' for #<Team:0x3e7e040> ... Wszelkie pomysły, jak poprawnie wyświetlić nazwę stąd?

Odpowiedz

29

Używasz text_field do odniesienia istniejącego obiektu, select z Sportem, ponieważ bardziej odpowiednie byłyby opcje.

To gdzie ma być zmieniony:

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

Do:

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

f.select wygeneruje pole zaznaczania w HTML, opcje mnie wszystkie sporty w swojej DB.

Niektóre dokumentację o tym:

Czystsze sposób byłoby ustawić zmienną @sports w kontrolerze i nazywają to wtedy w widokach :

# 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> 

źródło dodatkowego informacje: Jeśli chcesz "pre-select" opcja select, trzeba przekazać go jako drugi argument options_for_select pomocnika:

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

Dzięki @MrYoshiji . Próbuję twojej pierwszej sugestii, aby zacząć, a wartości poprawnie pojawią się w polu wyboru. Jednak podczas próby zapisu otrzymuję komunikat "ActiveModel :: MassAssignmentSecurity :: Error", który mówi: "Nie można masowo przypisywać chronionych atrybutów: sport_id' – Ricky

+2

Mam to działa, dodając': sport_id' do moich attr_accessors for the team_controller. Czy to był właściwy sposób? Próbowałem też drugiej metody i działa, ale nie rozumiem dlaczego. Czym zajmuje się "Sport.scoped"? Dlaczego jest to wymagane tylko w metodzie 'edit'? Przykład: metoda 'new' również udostępnia ten sam widok' _form.html.erb', ale nie dzwonię do '@sports = Sport.scoped', ale nadal działa ... Dzięki za wszelkie informacje – Ricky

Powiązane problemy