2013-05-31 13 views
14

私は2つのモデルで簡単な演習を行っています。Rails - 外来キー参照をフォームに表示

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

として定義スポーツとチームは、(注:私は足場を使用している理由は、急速に部品を/私は学ぶことができるので、実験のプロトタイプを作成されて、私はまだ慣れていないよ)

問題があることです(外部キー参照すなわち)私の「スポーツは」...だから、それはそれにその奇妙な#<blahl blah>表記持って、次の enter image description here

のように見せている

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

私は@team.sport.nameに1行を変更しようとしましたが、エラーが発生しますundefined method 'Ice Hockey' for #<Team:0x3e7e040> ...ここから適切に名前を表示する方法はありますか?

答えて

29

既存のオブジェクトを参照するためにtext_fieldを使用していますが、スポーツとしてオプションのselectがここでより適切になります。

、それを変更する必要がある場所です:

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

f.selectオプションは、あなたのDB内の私のすべてのスポーツますが、HTMLでの選択ボックスを生成します。

それについてのいくつかのドキュメント

はあなたのコントローラ内の変数@sportsを設定して、あなたの意見で、それを呼び出すようになりますきれいな方法:

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

Additionnal情報:あなたが選択するための「事前選択」オプションにしたい場合は、あなたがoptions_for_selectヘルパーの2番目の引数として渡しする必要があります。

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

おかげ@MrYoshiji 。私はあなたの最初の提案を開始しようとしている、と値が正しく選択ボックスに表示されます。しかし、保存しようとすると 'ActiveModel :: MassAssignmentSecurity :: Error'が表示されます。「保護された属性を大量に割り当てることはできません:sport_id' – Ricky

+2

私のattr_accessorsに':sport_id'を追加しましたteams_controller。これは正しい方法でしたか?また、2番目の方法を試してみましたが、うまくいきませんでしたが、なぜか分かりません。 'Sport.scoped'とは何ですか? 'edit'メソッドで必要なのはなぜですか?例えば、 'new'メソッドも同じ' _form.html.erb'ビューを共有していますが、 '@sports = Sport.scoped'を呼び出すことはありませんが、まだ動作しています...どんな洞察もありがとう – Ricky

関連する問題