Question Rails - Affichage des références de clés étrangères dans un formulaire


Je fais un exercice simple avec deux modèles. Sport et Equipes, définis comme

rails g nom échafaud sport: entier
rails g nom de l'équipe d'échafaudage: fans entiers: sport entier: références

(Remarque: la raison pour laquelle j'utilise un échafaudage est le prototypage rapide pour que je puisse apprendre / expérimenter les parties avec lesquelles je ne suis pas encore familier)

Le problème est que mon "sport" (c'est-à-dire la référence de la clé étrangère) se présente comme suit: enter image description here

Donc c'est bizarre #<blahl blah> notation à elle ...

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

J'ai essayé de changer la ligne pour @team.sport.name mais cela se traduit par une erreur undefined method 'Ice Hockey' for #<Team:0x3e7e040>... Des idées pour afficher correctement le nom d'ici ??


15
2018-05-31 02:02


origine


Réponses:


Vous utilisez un text_field pour référencer un objet existant, un select avec Sports comme options serait plus approprié ici.

C'est ici qu'il faut changer:

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

À:

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

le f.select générera une boîte de sélection en HTML, les options me feront tous les sports dans votre DB.

Quelques documentation à ce sujet:

Un moyen plus propre serait de définir une variable @sports dans votre contrôleur et appelez-le alors dans vos vues:

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

Informations supplémentaires: Si vous souhaitez "présélectionner" une option pour la sélection, vous devez la passer comme deuxième argument du options_for_select assistant:

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]

32
2018-05-31 02:25