29

私は最近Railsプロジェクトを開始し、RESTfulコントローラーを使用することにしました。キーエンティティ(国など)のコントローラーを作成し、、、、、、、、を追加indexしましnewた。ルートファイルに自分を追加しましたが、生活は良かったです。editcreateshowupdatedeletemap.resources :country

開発が少し進んだ後、問題にぶつかり始めました。コントローラで追加のアクションが必要になることがありました。最初にsearch、私の凝った自動補完検索ボックスのオプションを返すアクションがありました。次に、アプリケーションのさまざまな場所で2つの異なる方法で国を表示する必要が生じました(表示されるデータも異なるため、2つのビューだけではありませんでした)-index_fullアクションを追加しました。次に、IDではなく名前で国をURLに表示したかったので、show_by_nameアクションを追加しました。

RailsのRESTfulコントローラーで標準のindex、、、、、、を超えるアクションが必要な場合はどうしますか?手動ルートをroutes.rbファイルに追加(および維持)する必要がありますか(これは面倒です)、別のコントローラーに移動しますか、RESTfulになりませんか、または基本的なものがありませんか?neweditcreateshowupdatedelete

私は質問していると思いますが、RESTfulであるという特権のために、もっと一生懸命働き、routes.rbファイルにアクションを追加する必要がありますか?map.resourcesRESTグッズを追加するために使用していなかった場合、標準:controller/:action, :controller/:action/:idルートはほとんどすべてを自動的に処理します。

4

6 に答える 6

13

searchの特殊なケースとして扱いindexます。どちらのアクションも、リソースのコレクションを返します。リクエスト パラメータでは、ページ、制限、並べ替え順序、検索クエリなどを指定する必要があります。

例えば:

/resources/index # normal index
/resources/index?query=foo # search for 'foo'

そして resources_controller で:

before_filter :do_some_preprocessing_on_parameters

def index
  @resources = Resource.find_by_param(@preprocessed_params)
end

index_fullとに関してはsearch_by_name、現在のコントローラーを 2 つに分割することを検討するかもしれません。あなたが説明したことについてのにおいがあります。

そうは言っても、アプリが何も配信しない場合、安らかなルートをユーザーに強制しても意味がないというあなたの言うことは絶対に正しいです/:controller/:action/:id。決定を下すには、フォームとリンクで安らかなリソース ルート ヘルパーをどのくらいの頻度で使用しているかを調べます。あなたがそれらを使用していない場合、私は気にしません。

于 2008-10-23T17:44:42.510 に答える
8

モデルで標準の CRUD アクションを超える場合は、通常、必要に応じてメソッドを追加するだけです。検索は多くのコントローラーに追加するものですが、すべてのコントローラーに追加するわけではないため、追加してルートを通常どおり維持します。

map.resources :events, :collection => { :search => :get }

これらのアクションを完全に別のコントローラーに移動すると、一部のコントローラーを RESTful に保つことができますが、それらをコンテキスト内に維持する方がはるかに便利であることがわかりました。

于 2008-10-23T16:58:21.853 に答える
5

REST は、追加のビューを持つことができないとは指定していません。提供されたアクションのみを使用できる実際のアプリケーションはありません。これが、独自のアクションを追加できる理由です。

REST とは、サーバーに対してステートレスな呼び出しを行うことができることです。これまでのデータが返されるたびに、検索アクションはステートレスですよね? 代替表示アクションもステートレスであり、ビューが異なるだけです。

それらが手動ルートであるか、新しいコントローラーであるかについては、アクティビティがどの程度異なるかによって異なります。CRUD(作成、読み取り、更新、削除)操作の完全なセットを提供する場合、代替ビューは新しいコントローラーにあるとうまくいきます。データの代替ビューしかない場合は、代替ビュー アクションを追加するだけです。

言い換えれば、アプリケーションが RESTful ではないということではなく、自動生成された機能セットが結論ではなく出発点であることを理解することの問題です。

于 2008-10-23T17:01:33.640 に答える
0

この質問で回答済みだと思うので、REST についてはこれ以上説明しませんが、デフォルト ルートについて少し説明します。

デフォルト ルートに関する私の主な問題は、複数のサイトで同じ Rails アプリを使用している場合、見栄えが悪くなってしまうことです。

たとえば、あるアプリで人に見られたくないコントローラーがあるかもしれません:

http://example1.somesite.com/example_2/foo/bar/1

これと比較して

/:controller/:action/:id

これは、コントローラ example_2/foo、アクション バー、および ID 1 に移動します。

これは Rails のデフォルト ルートの主な欠陥であり、RESTful ルート (サブドメイン拡張を含む) または名前付きルート ( map.connect 'foo'... ) のみが修正できるものだと考えています。

于 2009-06-07T13:51:05.597 に答える
0

私の意見では、彼らはここで少し脱線したかもしれません。DRYはどうした?

Rails に戻ってきたところですが、ベータ版以来あまり開発を行っていませんでした。まだ電球がここに来るのを待っています。私はまだチャンスを与えていますが、現在のプロジェクトの終わりまでにそれが起こらなかった場合は、おそらく古い標準ルートに戻って、次のプロジェクトで実際に必要なメソッドを定義するだけです. .

于 2009-02-05T16:46:10.437 に答える
-1

デザインでRESTfulを維持するには、リソースと呼ばれるものを再考する必要があります。

あなたの例では、検索コントローラーのshow action(検索リソース)が安らぎを保つ方向です。

私の場合、ダッシュボードコントローラー(表示)とインプレースecditorsの単一フィールド用のコントローラー(表示と更新)があります

于 2008-10-25T03:38:55.027 に答える