5

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

我有一个由设计管理的用户模型。所以在我的路线中,我有:

devise_for :users

User模型中,我与模型Plan有关联。关联是:

User has_many Plans
Plan belongs_to User

在这一点上,我还有一个计划模型的资源,所以我可以获取所有的计划,显示一个特定的计划等等。但我想更进一步。

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

因此,例如,每当我去:

/users/:id/计划

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

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

4

2 回答 2

4

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

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

resources :plans, except: [:index]

我曾经resources :plans在里面resources :users有这样的路线/users/:user_id/plans,而resources :plans外面是不需要 a 的其余操作(编辑,销毁,...)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

这就是它的全部。设计在这方面不会妨碍您。

于 2012-12-30T14:19:36.913 回答