ruby-on-rails - 如何使用 devise gem 停止 Rails 应用程序中的 url 操作?
问题描述
我正在使用设计 gem 来处理用户。users 与项目有 one_to_many 关联。并且有多个用户,每个用户都有自己的仪表板,但用户仍然可以在 url 中操作 project_id 并能够查看其他用户的项目,还可以编辑删除它。我怎么能阻止呢?
登录后的用户重定向 (project#index) -
项目控制器.rb
def index
@projects = current_user.projects.all.order("created_at DESC").paginate(page: params[:page], per_page: 15)
end
def show
@project = Project.includes(stages: {tasks:}).find(params[:id])
@stages = @project.stages
end
def new
@project = current_user.projects.build
end
def create
@project = current_user.projects.build(project_params)
respond_to do |format|
if @project.save
format.html { redirect_to projects_url, notice: 'Project was successfully created.' }
format.json { render :show, status: :created, location: @project }
else
format.html { render :new }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
解决方案
您可以简单地使用current_user.projects
作用域show
:
def show
@project = current_user.projects.includes(stages: :tasks).find(params[:id])
end
这样,如果您编辑 URL 并输入属于另一个用户的 ID,您将得到ActiveRecord::RecordNotFound
,默认情况下 Rails 将其处理为 404 错误。
当然,您也可以使用这种方法来保护和edit
操作。update
destroy
推荐阅读
- python - 如何将一个文本文件中的多列替换为另一个文本文件中的列?
- javascript - 帆 JS。无法从 POST 表单“创建”
- class - 类从哪里来?
- ionic-framework - cordova build android 在 ionic 中不起作用
- php - 如何保持 MongoDB 与源相同?(拉拉维尔)
- scala - 在 SparkML Transformer 中缓存数据集
- python - 在 Python 中将主列表拆分为多个字典键和值
- google-chrome-devtools - 将本地文件系统上的源映射应用到 Chrome DevTools 中的精简生产代码
- python - 为什么在下面的代码中没有定义错误名称'student2dict'
- android - 在片段中重新加载 2 recyclerview