

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 は、一覧が動的なものであるため、ボタン押下前と内容が異なる可能性があります。

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


CC BY-SA 3.0
2015-01-22T09:16:36.920
5073
2018-03-21T14:45:51.910
2015-01-22T09:25:47.647
4978
7684
question
ruby ruby-on-rails
Rails 画面の表示内容を変更せずにコントローラからメッセージを返す方法


「しっくりこない」という感覚的な話をこれだけの情報で共有するのは無理なので一般論です。

画面遷移に伴い内容が変更されては困るという解決策については

  1. 表示されている内容を持って回る
  2. 画面を遷移させない

のどちらかです。

  1. については質問の中の案A.が該当します。セッションやDBや何かのストレージに保存しておく、というのも考えられます。項目そのものではなく、確実に表示が再現できる検索条件を持ち回る方法もあります。

2.についてはC.のAjaxでやるか、window.openで別ウィンドウを開き、結果の通知はそちらからwindow.openerを使って元のウィンドウを操作する方法が考えられます。


CC BY-SA 3.0
2015-01-27T03:56:42.790
5398
2015-01-27T03:56:42.790
5793
5073
answer


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

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


CC BY-SA 3.0
2015-02-17T06:41:12.420
6626
2015-02-17T06:41:12.420
8335
5073
answer


show アクション内で @items をセットしてないので、<% if @items.present? %> の判定がfalse
になり、表示が空になっていますね。


CC BY-SA 3.0
2015-02-17T10:25:24.707
6640
2015-02-17T10:25:24.707
65
5073
answer