Rails 画面の表示内容を変更せずにコントローラからメッセージを返す方法


Railsで、画面の表示内容を変更せずに、コントローラからメッセージを返す場合、どうすべきでしょうか？

以下のような仕様の画面を作成しています。

  * ある項目の一覧画面を表示する
  * 一覧のラジオボタンを選択、「次へ」ボタンで詳細画面へ遷移する
  * 遷移前処理で例外があった場合、一覧画面へメッセージを表示する

=> メッセージを表示する際、一覧画面の表示内容は「次へ」ボタンを押下する前の状態とする

現状では、以下のようなコードです。 Rails 4.1.5 を使用しています。

[code]

    # controller
      def index
        @items = items
      end
    
      def show
        @select_no = params[:select_no]
        # 遷移前処理
      rescue HogeError=> e
        flash.now.alert = "エラー発生"
        render :index
      end
    
      def items
        # items作成処理。非ActiveRecord。
      end
    
    
    # view index.erb
    <%= render "error_message_area" %>
    <% if @items.present? %>
      <%= form_tag(item_path, method: :get) do %>
        <table class="table" id="item_select">
          <thead>
            <tr>
              <th>選択</th>
              <th>No</th>
              <th>名称</th>
            </tr>
          </thead>
          <tbody>
            <% @items.each_with_index do |item, index| %>
              <tr>
                <td class="ctrl"><%= radio_button_tag("select_no", item[:no], index == 0) %></td>
                <td class="no"><%= item[:no] %></td>
                <td class="name"><%= item[:name] %></td>
              </tr>
            <% end %>
          </tbody>
        </table>
        <div>
          <%= button_tag type: "submit" do %>
            次へ
          <% end %>
        </div>
      <% end %>
    <% end %>
    
[/code]

現状では、エラー発生の場合に項目一覧が無くなります。

ラジオボタンの選択は、 `@select_no` を使うとして、項目一覧の取得は、案として

  * A. 項目一覧を `#show` に送る
  * B. 項目一覧を `#show` で再作成する( `#items` を呼びだす)
  * C. Ajax でどうにかメッセージだけ更新する

を思いつきましたが、どれもしっくりきません。案B は、一覧が動的なものであるため、ボタン押下前と内容が異なる可能性があります。

何かよい方法はないでしょうか？




信用点が足りていないので別回答で。  
もしAJAXで処理するのであればRJSという手もありますね。

buttonを、submitにせずに、押下されたイベントで  
フォーム内のアイテムを全て無効化にして(あるいは、操作不可能にして)  
form.serializeしたデータを飛ばして、  
処理結果が正常なら submit させるコードを返却させれば良いでしょう。  
失敗したらメッセージ表示して、有効化すればよいかと。

