只有创建了自己项目的用户才能看到编辑页面并进行实际编辑

时间:2015-07-22 15:20:38

标签: ruby-on-rails ruby ruby-on-rails-4 authentication devise

是否有一种简单的方法可以让创建自己项目的用户能够编辑他们的工作?

class Project < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :projects
end

如何检查登录的current_user是否可以实际编辑其内容?

如果我的项目网址类似localhost:3000/projects/24,我只希望创建此项目的用户可以进入localhost:3000/projects/24/edit查看该页面并实际编辑...

在撰写本文时,我现在认为这可能不是他最好的方式吗?也许我需要以某种方式做localhost:3000/projects/username1/24或其他什么?然后,如果他们编辑,它将是localhost:3000/projects/username1/24/edit ....我怎样才能做到这一点?

我的路线:

Rails.application.routes.draw do
  devise_for :users
  get 'users/:id' => 'users#show', as: :user
  resources :projects
end

我的控制器只是脚手架的基本内容

3 个答案:

答案 0 :(得分:2)

在项目控制器中,添加设计验证:

before_action :authenticate_user!, only: [:edit, :update]

这将确保用户在尝试查看编辑页面时登录。

接下来,您要确保登录用户是项目的所有者。

要执行此操作,您需要修改editupdate方法以查找project而不仅仅是参数:

def edit
  @project = current_user.projects.find(params[:id])
  #...
end

def update
  @project = current_user.projects.find(params[:id])
  #...
end

现在,只有拥有该项目的current_user才能查看编辑页面并发送更新。

加分点:如果您想重构上面的代码而不是两次使用相同的“@project =”行,您可以创建另一个before_action,它将为@project分配editupdate

before_action :authenticate_user!,   only: [:edit, :update]
before_action :find_project_by_user, only: [:edit, :update]

private

  def find_project_by_user
    @project = current_user.projects.find(params[:id])
  end

执行此操作,您无需在editupdate方法中添加相同的“@project =”行。

答案 1 :(得分:1)

  

也许我需要以某种方式做localhost:3000 / projects / username1 / 24或   什么?然后如果他们编辑,那就是   localhost:3000/projects/username1/24/edit ......我怎样才能完成   此?

由于用户有很多项目,您可能需要以下类型的网址:

localhost:3000/users/1/projects/2/edit

要完成此操作,您需要进行以下设置:

#routes.rb

resources :users, shallow: true do # notice shallow, it will eliminate users/ from the path, but as I'm not mistaken /user_id/ as well..
  resources :projects
end

控制器项目应放在:

app/controllers/users/projects_controller.rb

它应该看起来像

class Users
  class Projects
    #...
  end
end

通过此设置,您将确保该用户只能看到他的项目。

def index
  @projects = Projects.all # user can see all projects
  #...
end

def show
  @project = Projects.find(params[:project_id])
  #...
end

def edit
  @project = current_user.projects.find(params[:project_id]) # can edit only those, which he associated with
  # ...
end

并确保您只对可以编辑的用户显示link_to编辑。

关于路径:

有两种选择:

resources :users, path: '' do # will hide the users part from path
  #...
end
resources :users, shallow: true do # will actually also hide the users/user_id part
  #...
end

答案 2 :(得分:0)

您真正想要的是超越身份验证,进入授权。身份验证验证用户是否是他们所声称的人。授权验证允许用户对特定对象执行特定操作。查看Pundit Gem.。它非常简单易用。