You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Worker编辑页面信息错误、删除功能失效及权限跳转问题求助

问题描述
  • 编辑页面显示错误Worker信息:尝试编辑Worker A时,表单加载的是Worker B的详情;仅管理员账号能正常编辑自身信息,点击其他Worker的编辑按钮会跳转至登录页
  • 删除功能失效:控制台显示触发的是GET请求而非DELETE请求

相关代码

Worker Controller

def show
 @worker = Worker.find(params[:id])
end

def edit
  @worker = Worker.find(params[:id])
  @worker.company_id = params[:company_id]
  @role = Role.all
end

def update
  @worker = Worker.find(params[:id])
  @company_id = Company.find(params[:worker][:company_id])
  @role_id = Role.all
  if @worker.update(worker_params)
  @worker_role = Role.find(params[:worker][:role_id]).worker_roles.update(worker: @worker)
  flash[:success] = "Profile updated"
  redirect_to @worker
 else
   render 'edit'
  end
end

#DELETE
def destroy
 @worker = Worker.find(params[:id])
 @worker.destroy
 flash[:success] = "Worker deleted"
 redirect_to worker_url
end

edit.html.erb

<% provide(:title, "Edit worker") %>
<h1>Update your profile</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
  <%= form_with(model: @worker, local: true) do |f| %>
  <%= render 'shared/error_messages', object: f.object %>

  <%= f.label :name %>
  <%= f.text_field :name, class: 'form-control' %>

  <%= f.label :email %>
  <%= f.email_field :email, class: 'form-control' %>

  <%= f.label :phone_number %>
  <%= f.number_field :phone_number, class: 'form-control' %>

  <%= f.label :address %>
  <%= f.text_field :address, class: 'form-control' %>

  <%= f.label :password %>
  <%= f.password_field :password, class: 'form-control' %>

  <%= f.label :role_id %>
  <%= f.select(:role_id, Role.all.collect { |l| [ l.name, l.id] }, {class: "form-select"}) %>

  <%= f.hidden_field :company_id , value: 2%>

  <%= f.submit "Save changes", class: "btn btn-primary" %>
 <% end %>
</div>
</div>

show.html.erb

<% provide(:title, @worker.name)%>

<h2>Worker Info</h2>

<%= render @worker %>
<div class="row">
 <aside class="col-md-4">
   <section class="stats">
    <%= render 'shared/stats' %>
   </section>
   <div>
    <button class="btn btn-secondary"><%= link_to "Back to workers", workers_path %></button>
    <button class="btn btn-secondary"><%= link_to "Edit", edit_worker_path(current_worker) %></button>
    <button class="btn btn-secondary"><%= link_to "Delete", @worker, :confirm => "Are you sure?" ,:method => :delete%></button>
  </div>
 </aside>
</div>

解决方案

一、编辑页面信息错误&权限跳转问题

1. 修复编辑链接参数

show.html.erb中编辑按钮的edit_worker_path(current_worker)会固定跳转当前登录用户的编辑页,需改为对应Worker的路径:

<%= link_to "Edit", edit_worker_path(@worker), class: "btn btn-secondary" %>

2. 删除Edit方法冗余赋值

Controller的edit方法中@worker.company_id = params[:company_id]会覆盖数据库中查询到的原始值,直接删除该行即可。

3. 添加权限验证

在Worker Controller顶部添加权限拦截逻辑,控制普通用户仅能编辑自身信息,管理员可编辑所有用户:

before_action :correct_worker, only: [:edit, :update, :destroy]

private
def correct_worker
  @worker = Worker.find(params[:id])
  unless current_worker == @worker || current_worker.admin?
    flash[:danger] = "无操作权限"
    redirect_to root_url
  end
end

二、删除功能失效问题

1. 修复按钮嵌套问题

link_to生成的a标签嵌套在button中会导致浏览器默认触发GET请求,直接用link_to的class实现按钮样式:

<%= link_to "Delete", @worker, confirm: "Are you sure?", method: :delete, class: "btn btn-secondary" %>

或改用button_to生成表单提交DELETE请求:

<%= button_to "Delete", @worker, confirm: "Are you sure?", method: :delete, class: "btn btn-secondary" %>

2. 确保Rails UJS加载

检查application.js中是否包含UJS依赖:

  • Rails 5及之前://= require rails-ujs
  • Rails 6+:import Rails from "@rails/ujs"; Rails.start()

3. 修复Destroy方法跳转路径

redirect_to worker_url需传入id参数,改为列表页路径:

redirect_to workers_path

内容的提问来源于stack exchange,提问作者cherry123

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 17:55:31