5

ここ数日、Rails をいじっています。

リソースをネストする必要があるかどうか、およびそれを決定する方法がわかりません。

ユーザーがサインアップして todo リストを作成できるアプリケーションがあるとしましょう。これらのリストを公開するか非公開にするかを選択できます。

問題が発生しているのは、ユーザー リソースの下にリストをネストする必要があるかどうかです。

私がそれを行うと、次のような結果になります。

/users/:id/lists /users/:id/lists/:list_id

しかし、私が言いたいのは、すべての公開リストを の下に表示するということ/listsです。それはルートの安らぎを妨げますよね?

リストをネストできず、ユーザーとリストに個別のルートを設定できませんでしたが、少なくとも私の頭の中では、再び問題が発生しました。

/users/:id # some profile page /lists # should this link to all lists or all the current user's lists?

しかし、特定のユーザーのリストを表示したい場合、ルートがどうなるかわかりません。

これをどうにかして組み合わせる方法はありますか?ユーザー リソースの下にリストをネストしますが、/listslists_path はまだありますか? それとも、それは単なるカスタムの名前付きルートでしょうか?

私よりRailsに詳しい人がどうやってこれに取り組むのか興味があります。

4

1 に答える 1

1

ネストされたリストとネストされていないリストの両方を持つことができます。

resources :lists残りのルートをすべて作成します。

resources :users do
  resources :lists
end

次に、ネストされたすべてのルートと関連するヘルパーを作成します。このシナリオではネストされたルートを使用しません。これは、コントローラーがたわごとになるためです。

ネストされたルート(たとえば、users / 7 / lists)はデフォルトでへのルートですがListsController#index、に行く/listsもありますListsController#index。したがって、コントローラーにロジックを追加できます。

ListsController < ApplicationController
  def index
    if params[:user_id].present?
      # I'm in a user_list
    else
      # I'm in a public list
    end
  end
end

うーん。

さて、before_filterはどうですか?

ListsController < ApplicationController
  before_filter :unjankify_nested_routes

  private      

  def unjankify_nested_routes
    if params[:user_id].present?
      # I'm in a user_list
      render "users_#{@action}"
    else
      # I'm in a public list
    end
  end
end

これで、基本的に、users_show、users_indexなどと言うことでコントローラーメソッドのスコープを設定できます。しかし、その@action変数は何ですか?それをキャプチャする必要があります。

class ApplicationController     
  def process_action(name, *args)
    @action_name = name
    super rescue false #no super in tests
  end
end

内部のRailsメソッドをオーバーライドして、アクション名を取得します。それは楽しいですが、私たちが何か間違ったことをしているようです。

正しい方法(tm)

「正しい方法」はありませんが、スコープは良いオプションです

scope 'privates' do
  resources :lists
end

Privates::ListsControllerこれで、を含めることができますapp/controllers/privates/lists_controller。クエリパラメータにuser_idを追加するか、スコープの下にルートをネストできます。

scope 'privates' do
  resources :users do  
    resources :lists
  end
end
于 2012-12-02T20:06:54.870 に答える