rails:3939
From: Nobukazu TAKAI <nocturne_2_eflat_9_2@m...>
Date: Sat, 07 Dec 2013 15:19:38 +0900
Subject: [rails:3939] 効率的なコードの書き方について
皆様
高井と言います。
以下のことをやりたいのですが、うまい方法が分からないのでご教授願えないでしょうか
本の情報を管理したいとします。
そこで、Book model を作成し、table として
title, author1, author2, …, author10
があるとします。
登録されている author の数は、title によっては1人の場合もあるし10人の場合もあるとします。
今、controller で 
def show
  @book = Book.find(params[:id])
end
として @book にデータが入っているとします。
この内容を表示するために show.html.erb を作成します。
やりたいことは、登録されている author の数に応じて、表示を変えたいということです。
表示のイメージとしては
タイトル:Ruby on Rail の初歩
著者1:山田太郎
著者2:山田花子
著者3:     ← 著者がいないタイトルを表示したくない
こんな感じです。
show.html.erb としてまず思いつくのが以下のようなコードですが、これはあまりに冗長でやりたくないです。
<table class="attr">
  <%= form_for(@book) do |f| -%>
    <tr><th align="right"><%= f.label :title -%></th><td> : </td><td><%= @book.title -%></td></tr>
    <% unless @book.author1.empty? -%>
        <tr><th align="right"><%= f.label :author1 -%></th><td> : </td><td><%= @book.author1 -%></td></tr>
    <% end -%>
    <% unless @book.author2.empty? -%>
        <tr><th align="right"><%= f.label :author2 -%></th><td> : </td><td><%= @book.author2 -%></td></tr>
    <% end -%>
    以下 author10 まで書く
  <% end -%>
<% end -%>
そこで、次に思いついたのが、
<% authors = [@book.author1, @book.author2, @book.author3, @book.author4, @book.author5, @book.author6, @book.author7, @book.author8, @book.author9, @book.author10] -%>
  <% for answer in answers -%>
    <% unless answer.empty? -%>
のように配列をまず作って、それを利用して author が空かどうかの判断をする、という方法です。
この方法の場合は上のコードよりは短く、確かに私の求める結果にはなったのですが、後から author11からauthor20 を追加しようとするとこの配列を変更しなければならないという意味では前のコードと本質的には変わらない気がしました。
これをループ文を使って書けないかと試行してみたのですが、どうしても出来ないので皆様のお知恵を拝借したい次第です。
私が考えてみたがダメだったコードですが、以下の通りです。
<%= form_for(@paper) do |f| -%>
  <tr><th align="right"><%= f.label :title -%></th><td> : </td><td><%= @paper.title -%></td></tr>
   <% 1.upto(10) do |idx| -%>
      <% if author#{idx} -%>
        <%= f.label :"author#{idx}" %><td> : </td><td><%= @book.author#{idx} -%></td></tr>
      <% end -%>
   <% end -%>
<% end -%>
<%= f.label :"author#{idx}" %> これは動作するのですが、
if 文の中で変数を使うことが出来なかったりして、挫折しました。
ループを使った効率的なコードをどのように書けばよいか、教えていただければ幸いです。
宜しくお願い致します。
-> 3939 2013-12-07 07:19 [nocturne_2_eflat_9_2] 効率的なコードの書き方について 3940 2013-12-07 09:15 ┣[dezawa@a... ] 3941 2013-12-07 10:12 ┗[ayumu.aizawa@g... ] 3942 2013-12-07 10:44 ┗[dezawa@a... ] 3944 2013-12-07 15:10 ┗[nocturne_2_eflat_9_2] 3951 2013-12-13 10:40 ┣[nocturne_2_eflat_9_2] 3952 2013-12-13 10:40 ┗[nocturne_2_eflat_9_2] 3953 2013-12-15 14:47 ┗[dezawa@a... ] 3954 2013-12-16 07:02 ┗[nocturne_2_eflat_9_2]