プルダウンリスト

■ビューでのプルダウンリスト作成のポイント



【要求】
プルダウンリストを作成していた際に、リストの中の3つのカラムの内1つを消すとする。すると、もともとあるそれ
以外の値(今も登録されている)の場合は、2つがプルダウンに表示される。
しかし、その消した値(もちろん消せると言う事は外部キーではなく、選択肢としてのみDBを使っている)を含む
レコードを編集する場合は、その値のままにしておきたいので、プルダウンリストに表示したい。それを次のように
書いた。

                                                                                                                          • -
<p><label for="apply_channel">経路</label><br/>
<%= 
if @student.apply_channel == "" 
  default_msg = [["経路",""]]
else
   
  default_msg = []
    
  unless @apply_channels.include?([@student.apply_channel,@student.apply_channel])
    @apply_channels += [[ @student.apply_channel , @student.apply_channel ]]
  end
end
options = default_msg + @apply_channels
select(:student,:apply_channel,options)
%></p>
                                                                                                                          • -


学生は経路を選択する。そのために、まず、経路テーブルから経路一覧を出す。新規作成の場合はそれでOK。
更新の場合、学生の持っている値が、リスト内にあれば、消す(重複表示)を避けるため。



ちなみに、if @student.apply_channel == "" 〜は、新規登録の場合、プルダウンにメッセージを入れておくため。
編集の際には、現在値が入っているとする。この時に、消えた値を含むレコードを参照すると、その値が2回でて
しまった。その原因は以下の通り。

[ [1,2] ] + [3,4] => [ [1,2],[3,4] ]でなく、[ [1,2],3,4]。
@apply_channels += [ [ @student.apply_channel , @student.apply_channel ] ]を
@apply_channels += [ @student.apply_channel , @student.apply_channel ]
書くとそうなる。発見できたのは、optionをpでWebrickメッセージと一緒に出した際に、[ ]の数が変だったから、
irbで確かめた。


また、この例では、POST先をstudent.applychannelにしてあるが、これは外部キーではない。
apply_channelテーブルから値を選ぶが、登録する際には、その文字列のみを登録する使用。
外部キーでリレーションが貼られている場合、select(:student,:apply_channel,options)のようにうまく
かけない。NoMethodErrorか何かになる。