2016-04-13 2 views
1

私はリソースルートメソッドが非常に便利だとわかりますが、createdestroyパスヘルパーは作成されません。"Create"ルートパスヘルパー

私は

<% form_for(@object) %> 

を書くことは、自動的にルート名を取得することになって、そして我々は、彼らが存在する場合、自動的に名前空間/プレフィックスを取得するために、配列や記号で遊ぶことができますが、私は多くのルートを持っていることをされていることを理解します複雑scopeの定義を取得することができませんcreate_xxxヘルパーは完全に私を悩ます

書くより簡単な解決策はありませんか? (私はヘルパーを生成している間、デフォルトのRESTful URLを維持しようとしています)

complicated_scope do 
    resources :my_resources, except: [:create, :destroy] do 
    post '', on: :collection, action: :create, as: 'create' # plus this generates a pluralized version, not very intuitive `create_complicated_scope_my_resourceS_path` 
    delete '', on: :member, action: :destroy, as: 'destroy' 
    end 
end 

EDIT。 「多少複雑スコープ」

# Company access routes under /company/ 
namespace :company do 
    # I need a company id for all nested controllers (this is NOT a resource strictly speaking, and using resources :companies, only: [] with 'on: :collection' doesn't generate appropriate urls) 
    scope ':company_id' do 
    # Company administrators 
    namespace :admin do 
     # There is a lot of stuff they can do, not just administration 
     namespace :administration do 
     # There are several parameters grouped in different controllers 
     resources :some_administrations do 
      ... # finally RESTful actions and others here 
     end 
     end 
    end 
    end 
end 
+0

あなたはどのような種類の複雑な範囲を扱っているのですか?私は複雑な範囲がおそらくにおいであると思うでしょう。あなたが 'create_xxx'ヘルパーを探すことによって回避するのではなく、ルーティングを単純化できるかどうか調べる価値があります。 – Nick

答えて

1

機知ルーティングがcreatedestroyヘルパーを作成し、彼らが行われたHTTPリクエストのタイプによって暗示している(POSTそれぞれDELETE)ないので、ルーティング・ヘルパー・メソッドが動作するはずの私の例あなたが提供したコードでうまくいく。

では、次のルート定義があるとします。HTTP動詞ので

link_to "Delete [resource]", complicated_scope_resource_path(id: @my_resource.id), method: :delete 

:簡単な例として

complicated_scope do 
    resources :my_resources 
    end 
end 

を、削除する場合には、あなたはそうのような名前のルートを使用することができますこのヘルパーメソッドがコントローラのdestroyメソッドにルーティングするコントローラアクションをあいまいにします。

また、配列の構文も使用できるはずです。

link_to "Delete [resource]", [:complicated_scope, @my_resource], method: :delete 

同じフォームのために行く:

<%= form_for [:complicated_scope, @my_resource] do |f| %> 

@my_resource場合newアクションの場合のように、これは/にpostリクエストを送ると同等になり、(永続化されません)新しいオブジェクトであります複雑なスコープ/ my_resourceを、リクエストの本文にparamsという形式で入力します。 @my_resourceeditアクションの場合のように、上記/complicated_scope/my_resource/:id/updateを使用してコントローラのupdate作用にPUT/PATCHれるであろう経路の送信に相当するであろう、存在する場合、あるいは

+0

ああ、私は経路の引数が自動的にオブジェクトが存在するときは 'patch'メソッドです。私はしばしば(モーダルなどの)アクションを作成するための特別なフォームを使用していますが、私は更新アクションのコードとはまったく異なりますので、リソースヘルパーは '_form'オブジェクトを共有した"レールの方法 "作成と更新の間に... –

+0

ええ、私はそれが典型的だと思います。オブジェクトを更新するためのフォームは、通常は作成とは異なります(私の経験では少なくとも)。しかし、そのような状況では上記の内容がそのまま適用されるはずであり、必要に応じて 'method::post'や' method::patch'を明示的に指定することができます。 –