3

私は Grails にはかなり慣れていませんが、さまざまな言語 (Perl、Python、Ruby) で他の mvc フレームワークを使用して Web アプリケーションを開発した経験は豊富にあります。

grails での CRUD の意味を理解しようとしています。

基本的に、Grails は create 関数に対して次の 2 つのメソッドをデフォルトで作成します。

create はフォームを表示するために使用されます save は投稿されたフォームを保存するために使用されます

現在、さまざまなフレームワークから来ており、作成するためのメソッドが 1 つだけであることに慣れています。

この関数は、リクエスト メソッドが GET の場合はフォームを表示し、リクエスト メソッドが POST の場合はフォームを保存します。

なぜ Grails は、この機能に対してまったく異なるメソッドを持つ道をたどったのですか? 手で変更できることはわかっていますが、これを行うことの意味は何ですか? 何を失い、何を得るのか。

これはあまり具体的な質問ではないことはわかっていますし、炎上戦争を始めたくないのは確かですが、なぜどちらかの方法を選択する理由を理解したいのです...

アンサーをよろしくお願いします。

4

2 に答える 2

8

コントローラを生成すると、{インデックス、リスト、作成、保存、表示、編集、更新、削除}アクションを持ついくつかのデフォルトテンプレートが使用されます。これは出発点にすぎないか、参照用に使用されます。

私が一般向けのアプリで通常行うことは、HTTPメソッドに基づいてルーティングを処理するURLマッピングを設定することです。詳細については、http: //grails.org/doc/latest/guide/theWebLayer.html#mappingHTTPを参照してください。

基本的に、これにより次のようなことができます。

static mappings = {
   "/product/$id"(controller:"product") {
       action = [GET:"show", PUT:"update", DELETE:"delete", POST:"save"]
   }
}

コントローラでは、アクションは異なる目的を果たすため、別々にする必要があります。Grailsを使用すると、HTTPメソッドルーティングを処理するようにURLマッピングを設定できます。

于 2013-02-07T16:25:35.510 に答える
3

generate-controllerandによって生成されたコードgenerate-allは、利便性と何をすべきかの提案にすぎません。ただし、アプリケーションに生成されるため、必要に応じて編集するか、必要に応じてすべてを最初から記述します。

createGET 要求を受け入れて新しいインスタンスを作成し、GSP をレンダリングしてインスタンスを作成するアクションに代わるものと、savePOST 要求のみを受け入れて実際の作成を行うアクション (インスタンスがcreate両方を行う単一のメソッドである場合):

def create() {
   if (request.post) {
      // persist the new instance
   }
   else {
      // render the GSP
   }
}

これには、何をすべきかを決定するための明示的なロジックが必要であり、コードが乱雑になります。Grails が採用するアプローチは、各アクションがより焦点を絞っており、1 つのことだけを行うため、よりクリーンです。これには、テストが容易になるという追加の利点があります。

2 つのアクション間でロジックが共有されることがわかった場合は、いつでもそれをリファクタリングして、両方が呼び出すプライベート メソッドにすることができます。

于 2013-02-07T16:18:29.180 に答える