让我们看看我是否能对自己的疑虑进行充分的解释。

我有一个由Devise管理的用户模型。所以在我的 route ,我有:

devise_for :users

用户模型中,我与模型计划有关联。关联为:
User has_many Plans
Plan belongs_to User

此时,我还具有计划模型的资源,因此我可以获取所有计划,显示特定计划等等。但我想走得更远。

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

因此,例如,无论何时我去:

/users/:id/plans

我希望能够看到该特定:id用户的计划。如果正在访问该URL的用户是已登录的用户,那么我希望他能够编辑那些计划。

我该如何处理所有这些行为?那里有什么 gem 可以帮助它吗?或者我需要在 View 中说条件是否为current_user ...

最佳答案

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

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

resources :plans, except: [:index]

我在resources :plans内使用了resources :users来获得类似/users/:user_id/plans的路由,而外面的resources :plans用于不需要user_id的其余 Action (编辑,销毁...),即,计划由唯一的ID标识因此,您不需要user_id从数据库中获取它即可进行编辑或销毁。

现在,对于 Controller ,我们可以像这样:
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

关于ruby-on-rails - 对Rails中的嵌套资源和身份验证感到困惑,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14090894/

10-08 23:15