是否有一种简单的方法可以让创建自己项目的用户能够编辑他们的工作?
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
我的控制器只是脚手架的基本内容
答案 0 :(得分:2)
在项目控制器中,添加设计验证:
before_action :authenticate_user!, only: [:edit, :update]
这将确保用户在尝试查看编辑页面时登录。
接下来,您要确保登录用户是项目的所有者。
要执行此操作,您需要修改edit
和update
方法以查找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分配edit
和update
:
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
执行此操作,您无需在edit
和update
方法中添加相同的“@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.。它非常简单易用。