对Rails中的嵌套资源和身份验证感到困惑

Hom*_*ith 5 ruby-on-rails crud associations devise

让我们看看我是否可以很好地解释自己的疑虑.

我有一个由Devise管理的用户模型.所以在我的路线中我有:

devise_for :users
Run Code Online (Sandbox Code Playgroud)

在用户模型中,我与模型计划有关联.关联是:

User has_many Plans
Plan belongs_to User
Run Code Online (Sandbox Code Playgroud)

此时我还有计划模型的资源,因此我可以获取所有计划,显示特定计划等.但我想更进一步.

我希望能够看到特定用户的计划,并让特定用户查看他自己的计划并进行编辑.

所以,例如,每当我去:

/用户/:ID /计划

我希望能够看到该特定的计划:id用户.如果访问该URL的用户是登录的用户,我希望他能够编辑这些计划.

我该如何管理所有这些行为?有没有任何宝石可以帮助它?或者我需要在视图中做条件,如果current_user ...

Ahm*_*rif 4

让我们从路线开始,您可以像这样制定路线:

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

resources :plans, except: [:index]
Run Code Online (Sandbox Code Playgroud)

我resources :plans在内部resources :users使用了这样的路线/users/:user_id/plans,而resources :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
Run Code Online (Sandbox Code Playgroud)