0

Angular を使用して JSON リクエストをコントローラーに送信しています。コントローラーで次のように通知します。

flash[:notice] = "Toon has been tagged"

rabl テンプレートを使用して JSON 応答を返し、次のようなフラッシュ通知コンテンツも含めたい場合:

object @toon
attributes :id, :uuid, :get_tag_string
if flash
  node(:flash) do |f|
    flash.each do |k, v|
       { :msg => v, :name => k }
    end
  end
end
attributes :errors

私のAngularコードは応答を処理し、フラッシュ通知の内容を正しく表示します. しかし、ここで問題が発生します。ページが更新されると、レイアウト ビューに次のコードがあるため、フラッシュ メッセージが再び表示されます。

        <% flash.each do |key, value| %>
        <div class="row-fluid">
            <div class="span8 offset1"><%= content_tag(:div, value, class: "alert alert-#{key} center")%></div>
        </div>
        <% end %>

これを削除するか、コントローラーで after_filter を実行して flash.clear を呼び出すことができます。これを行うより良い方法はありますか?

ありがとう!!

4

2 に答える 2

1

私もレールでangularjsを使用しています。サーバー(レール)からのエラーメッセージを処理する方法は、角度のあるルート変更イベントを使用することです。サーバーからのフラッシュ メッセージを扱っているため、実際には同じ概念です。

エラーを表示するAngularアプリ(あなたの場合はフラッシュメッセージ)では、ng-showを変数とともに使用します。

<div ng-show="showMessages" class="alert">
  {{myMessages}} // obviously here you may have an ng-repeat or similar
</div>

メインの角度コントローラーで、 $scope.showMessages (true または false) を設定しています。この時点で、それは同じ問題です。私のコントローラーでは、次のコールバックを使用して、ルートがいつ変更されたかを確認します。変更されたら、$scope.showMessages を false に設定できます。

$scope.$on('$routeChangeStart', function (scope, next, current) {
   $scope.showMessages = false;
}

また、この routeChangeStart イベントを使用して、メッセージを次のページに表示したい場合に対処します。別の変数を追加して、「次のページのみに表示」を制御します。

個人的には、フラッシュ メッセージを消去するためにサーバーに戻ることはありません。これは「費用がかかる」ように思えますが、余分な往復を強いられることはありません。

于 2013-09-02T22:41:19.813 に答える