次のルートが与えられます:
resource :public_profile do
resources :posts
end
resource :private_profile do
resources :posts
end
PostsController
で、どの特異なリソース内にネストされているかをどのように判断できますか?
次のルートが与えられます:
resource :public_profile do
resources :posts
end
resource :private_profile do
resources :posts
end
PostsController
で、どの特異なリソース内にネストされているかをどのように判断できますか?
同じ「ベース」コントローラーPostsControllerから拡張された異なるコントローラーに(ルートで指定することにより)それらをルーティングできます。拡張コントローラーでは、それらを識別します。
元:
resource :public_profile do
resources :posts, :controller => "public_profile_posts_controller"
end
resource :private_profile do
resources :posts, :controller => "private_profile_posts_controller"
end
およびコントローラー
class PublicProfilePostsController < PostsController
before_filter :identify_controller
def identify_controller
@nested_resource_of = :public_profile
end
end
class PrivateProfilePostsController < PostsController
before_filter :identify_controller
def identify_controller
@nested_resource_of = :private_profile
end
end
その後、変数にアクセスできます
@nested_resource_of
PostsControllerアクションで
これを行う1つの方法は、メインを拡張するコントローラーをさらに2つ作成しPostsController
、
resource :public_profile do
resources :posts, controller: "PublicPostsController"
end
resource :private_profile do
resources :posts, controller: "PrivatePostsController"
end
これはさまざまな方法で行うこともできます。たとえば、多分それは理にかなっています
class ProfileController < ApplicationController; end
class PostsController < ApplicationController; end
class Private::ProfileController < ProfileController; end
class Private::PostsController < PostsController; end
class Public::ProfileController < ProfileController; end
class Public::PostsController < PostsController; end
ルーティング付き
resource :public_profile, controller: "Public::ProfileController" do
resources :posts, controller: "Public::PostsController"
end
resource :private_profile, controller: "Private::ProfileController" do
resources :posts, controller: "Private::PostsController"
end
これをどのように設定するかに関係なく、実際にはそのネストに固有の別のコントローラー内で実行され、そのネストに固有のロジックに最適な場所を持つことができるため、ネストされているリソースを簡単に「知る」ことができます。一般的なロジックでは、それを親に入れますPostsController
。
これを行う別の方法は、いいねを追加するbefore_filter
ことPostsController
です
before_filter :check_nesting
private
def check_nesting
@is_public_profile = params.include?(:public)
end
のようなルーティングがあります
resource :public_profile, public: true do
resources :posts, controller: "PublicPostsController"
end
resource :private_profile, private: true do
resources :posts, controller: "PrivatePostsController"
end
しかし、私はこのアプローチを気にしません。