6

Rails v2.1 を使用して、複数の場所からアクセスできるコントローラーのアクションがあるとします。たとえば、Rails アプリ内には、2 つの異なるビューからユーザーを編集するためのリンクがあります。1 つはユーザー インデックス ビューで、もう 1 つは別のビュー (すべてのページのナビゲーション バーから) からです。

ユーザーがクリックしたリンクに応じて、ユーザーを適切な場所にリダイレクトする最良の方法は何だろうと思っています。例えば:

例 1:

  1. すべてのユーザーを一覧表示する
  2. リスト内のユーザーの「編集」をクリックします
  3. ユーザーがフォームで「保存」をクリックすると、コントローラーは 1 にリダイレクトします。

例 2:

  1. ユーザーはアプリケーション内の任意のページにいる可能性があり、ナビゲーション バーには現在のユーザーを編集するためのリンクが表示されます
  2. ユーザーがリンクをクリックして編集する
  3. ユーザーがフォームの「保存」をクリックすると、コントローラーは、ユーザーがナビゲーション バーの「編集」リンクをクリックしたときに表示されていたページにリダイレクトします。

私はそれが過去に行われたのを見てきました:

  1. リンクが表示された元のコントローラー/アクションを使用して、元の編集リンクにパラメーターを配置します。これをより DRY にするために、ヘルパーで @controller.controller_name と @controller.action_name を使用できます。
  2. コントローラーはパラメーターをセッション変数に保存します。
  3. コントローラーがレコードを保存すると、セッション変数にリダイレクトされます。

このソリューションで特に気に入らないのは、ビュー内の該当するすべてのリンクにパラメーターを追加する必要があることです。これをすべてコントローラーに組み込む方法があるかどうか疑問に思っています。

私が考えていたより良い方法の1つは、次のことでした。

  1. 「編集」アクションに before_filter を配置して、リファラーをセッションに保存します (これは十分に信頼できますか?)。
  2. 「更新」がヒットすると、コントローラーはセッション変数にリダイレクトしてから、セッション変数を削除します。

これを行う最善の方法について何か考えはありますか?

4

3 に答える 3

2

Flash : 次のリクエストでのみ使用するデータをフラッシュに保存できます。その後、自動的にクリアする必要はありません。エラーメッセージだけでなく、一度しか必要としないアプリケーションコンテキストの限られたビットに対してもうまく機能します!

あなたが最後に HTTP アクセスを行ったことを知っています。ユーザーを最後にアクセスした URL にリダイレクトする必要がある場合は、それを実行してください。request.referer は、情報をブロックしないほとんどのブラウザの場合、その人が最後にいた URL を提供します。

#in edit controller
...
flash[:page_to_redirect_to] = request.referer || "/my/default/path"
...

#in save controller
redirect_to flash[:page_to_redirect_to] || "/my/default/path"

ちなみに、これらをハードコーディングすることはお勧めしません。

before_filter : 多くの Rails 開発者がこれをお気に入りのハンマーとして使用し、他のすべてを釘に変えています。フィルターは、コントローラー内のすべてまたは実質的にすべてのメソッドに機能を公開する場合に役立ちます。ここで必ずしもそうであるかどうかはわかりませんが、走行距離は異なる場合があります。必要に応じて、フィルターを上記の 2 つのトリックと組み合わせることができます。

于 2008-09-24T08:15:35.853 に答える
1

edit アクションで before_filter を使用するのが最も目立たないと思います。

リファラーは十分に信頼できる必要があります...リファラーが利用できない場合に備えてデフォルトを設定するだけで(たとえば、誰かが編集ページをブックマークした場合)、問題ありません。

于 2008-09-24T05:02:08.003 に答える
0

もう 1 つの方法は、フォームをhttp://flowplayer.org/tools/overlay/index.htmlのようなオーバーレイにロードし、ajax 送信時にオーバーレイを閉じることです。これをオートコンプリートと組み合わせて、「新規追加」オプションを提供します。オーバーレイ フォームが送信されると、オートコンプリートを埋めるために処理される json でいくつかのデータを返します。(私はそれをすべて支援するために独自のプラグインを作成しました)

もう少し手間がかかりますが、エンドユーザーにとっては非常にうまく機能します。

于 2011-01-02T15:15:34.967 に答える