Rails 8.0.2 + ActiveAdmin 3.3.0 DELETE请求失效问题求助
解决Rails 8.0.2 + ActiveAdmin 3.3.0中DELETE操作失效问题
针对你的技术栈(Propshaft + ImportMap + Turbo Rails),以下是适配的解决方案:
1. 确保Turbo正确导入并配置
首先确认Turbo在项目中正常加载,且避免与Rails UJS冲突:
- 在
config/importmap.rb中添加:pin "turbo-rails", to: "turbo.min.js", preload: true - 在
app/javascript/application.js中导入:import "@hotwired/turbo-rails"
注意:不要同时导入Rails UJS,Turbo已替代其处理非GET请求的功能,共存会导致冲突。
2. 修复ActiveAdmin的Delete按钮属性
ActiveAdmin 3.3.0默认的Delete链接未添加Turbo所需的data-turbo-method属性,导致请求被转为GET。可选择全局或单个资源修复:
全局修复(覆盖所有Admin资源)
在app/admin/application.rb中添加:
ActiveAdmin::ResourceController.class_eval do action_item :destroy, only: :show do link_to( 'Delete', resource_path(resource), method: :delete, data: { turbo_method: :delete, turbo_confirm: '确定要删除吗?' # 可选,添加删除确认提示 } ) end end
单个资源修复
在具体的Admin资源文件(如app/admin/post.rb)中自定义动作按钮:
ActiveAdmin.register Post do action_item :destroy, only: :show do link_to( 'Delete', post_path(post), method: :delete, data: { turbo_method: :delete, turbo_confirm: '确定要删除吗?' } ) end # 确保destroy动作接收DELETE请求 member_action :destroy, method: :delete do resource.destroy redirect_to collection_path, notice: "#{resource_class.model_name.human} 删除成功" end end
3. 验证Propshaft资源加载
确保ActiveAdmin的静态资源被Propshaft正确处理:
- 在
config/initializers/active_admin.rb中确认配置:config.javascripts = ['active_admin'] config.stylesheets = ['active_admin']
Propshaft会自动处理这些资源的加载,无需额外配置。
4. 系统测试适配
如果系统测试因DELETE请求未触发失败,可调整测试逻辑:
- 使用Capybara时,直接发送DELETE请求而非模拟点击:
delete post_path(post) expect(response).to redirect_to posts_path - 或手动模拟Turbo的请求行为:
page.driver.submit :delete, post_path(post), {}
内容的提问来源于stack exchange,提问作者Brian Lane
相关产品推荐
相关产品推荐

