5

私が抱えている疑問について、十分に説明できるか見てみましょう。

Devise によって管理される User モデルがあります。したがって、私のルートには次のものがあります。

devise_for :users

Userモデルでは、モデルPlanと関連付けています。関連付けは次のとおりです。

User has_many Plans
Plan belongs_to User

この時点で、Plan モデルのリソースも用意されているので、すべての Plan を取得したり、特定の Plan を表示したりできます。でももっと行きたい。

特定のユーザーの計画を表示し、特定のユーザーが自分の計画を表示して編集できるようにしたいと考えています。

したがって、たとえば、次の場所に行くときはいつでも:

/users/:id/プラン

その特定の :id ユーザーの計画を確認できるようにしたいと考えています。そして、その URL にアクセスしているユーザーがログインしているユーザーである場合、そのユーザーがそれらのプランを編集できるようにしたいと考えています。

このすべての動作を管理するにはどうすればよいですか? それを助ける宝石はありますか?または、現在のユーザーが...

4

2 に答える 2

4

ルートから始めましょう。ルートは次のように作成できます。

resources :users do
  resources :plans, only: [:index]
end

resources :plans, except: [:index]

私はresources :plans内側resources :usersをこのようなルートにするために使用しましたが/users/:user_id/plansresources :plans外側はを必要としない残りのアクション(編集、破棄など)用です。user_idつまり、計画は一意のIDで識別されるため、user_id編集または破棄するためにデータベースから取得する必要があります。

コントローラーについては、次のように作成できます。

class PlansController < ApplicationController
  before_filter :is_plan_owner?, only: [:edit, :update]

  def index
    @plans = Plan.where(:user_id => params[:user_id])
  end

  def edit
    @plan = Plan.find(params[:id])
  end

  private

  def is_plan_owner?
    if current_user != Plan.find(params[:id]).user
      # Scream, shout, call 911 and/or redirect else where
    end
  end
end
于 2012-12-30T14:13:21.327 に答える
4

これは、他のネストされたリソースを使用する場合と同じです。devise_forファイル内のへの呼び出しはroutes.rb、ユーザー モデルへの RESTful ルーティングを提供しません。ネストされたリソースなしで、標準の Devise インストールのみで考えてみてください。もしそうなら、あなたはrake routes次のようなものを手に入れるでしょう:

  new_user_session GET  /users/sign_in(.:format)       devise/sessions#new
      user_session POST /users/sign_in(.:format)       devise/sessions#create
     user_password POST /users/password(.:format)      devise/passwords#create
 new_user_password GET  /users/password/new(.:format)  devise/passwords#new
edit_user_password GET  /users/password/edit(.:format) devise/passwords#edit
           sign_in GET  /sign_in(.:format)             devise/sessions#new

これはユーザーのインデックス作成や表示には何も提供しないため、そのためのルートを追加する必要があります。

resources :users, only: [:index, :show]

これで次のようになります。

users GET /users(.:format)     users#index
 user GET /users/:id(.:format) users#show

さて、ここまで来て、ネストされたリソースを追加するだけで、Devise は気にしません。

resources :users, only: [:index, :show] do
  resources :plans
end

これにより、必要な機知に富んだルーティングが可能になります

    user_plans GET /users/:user_id/plans(.:format)          plans#index
              POST /users/:user_id/plans(.:format)          plans#create
 new_user_plan GET /users/:user_id/plans/new(.:format)      plans#new
edit_user_plan GET /users/:user_id/plans/:id/edit(.:format) plans#edit
     user_plan GET /users/:user_id/plans/:id(.:format)      plans#show
               PUT /users/:user_id/plans/:id(.:format)      plans#update
            DELETE /users/:user_id/plans/:id(.:format)      plans#destroy

それだけです。Devise はこれであなたの邪魔にならないようにします。

于 2012-12-30T14:19:36.913 に答える