如何将Rails视图中JS变量传递至Action及解决CanCan授权异常
解决RailsAdmin自定义Action表单提交的权限与参数传递问题
看起来你现在卡在两个核心问题上:一是表单提交时触发的CanCan权限错误,二是如何把JS维护的邮箱列表成功传递到后端Action里。我来一步步帮你梳理解决:
一、修复表单提交的路由与权限问题
你当前硬编码formaction的URL是导致权限校验失败的关键——这种写法会让参数混乱,而且不符合RailsAdmin的路由匹配规则。我们改用Rails原生的路由辅助方法来生成正确的提交路径:
1. 替换硬编码路径,规范表单结构
首先可以通过rails routes | grep bulk_properties命令确认自定义Action的路由名称(通常是rails_admin_bulk_properties_path),然后重构表单:
= form_tag rails_admin_bulk_properties_path(Application: 8, Company: 1, locale: :en), method: :put do .multiselect-form .wrapper{"data-children-count" => "1"} %select.collection{:multiple => "multiple", :id => "multi", :name => "user_emails[]"} %hr/ %h1 List of user properties -@all_properties.each do |prop| %input{:name => "#{prop.name}_checkbox", :type => "checkbox", :id => "#{prop.name}_checkbox"} #{prop.name} %input{:name => prop.name, :type => "text", :id => prop.name} %br %input{:type => "submit", :value => "Submit"} %br/ %br/
这种写法会自动处理Rails的CSRF令牌,同时保证路由匹配准确,避免触发不必要的权限校验。
2. 给CanCan添加Action权限
RailsAdmin会校验用户是否有权限执行自定义Action,所以需要在Ability类里显式声明权限:
class Ability include CanCan::Ability def initialize(user) # 其他权限配置... can :bulk_properties, User end end
二、传递JS维护的邮箱列表
要让JS维护的多选框值被表单正确提交,只需要给#multi设置正确的name属性——比如user_emails[],这样后端就能直接通过params[:user_emails]拿到选中的邮箱数组。
在你的PUT分支Action里,就可以这样获取并处理:
elsif request.put? # UPDATE user_emails = params[:user_emails] # 这里就是JS维护的邮箱列表数组 # 你的业务逻辑处理... end
只要JS是正常修改多选框的选中状态,浏览器会自动把选中项打包成数组提交,不需要额外的JS同步逻辑。
三、额外注意点
- 确保页面头部包含
= csrf_meta_tags:Rails的CSRF保护会拦截没有令牌的PUT请求,用form_tag生成的表单会自动添加,但手动写的form标签需要自己确保令牌存在。 - 避免硬编码参数:如果
Application和Company是动态值,建议从当前请求上下文(比如params[:Application])或用户关联数据中获取,不要固定写死。
这样调整后,表单应该能正确提交到你的BulkProperties Action,同时顺利获取到JS维护的邮箱列表,CanCan的权限错误也会消失。
内容的提问来源于stack exchange,提问作者Daniel Lawton
相关产品推荐
相关产品推荐

