Devise 3.2+Rails 3.2.22.5中member额外参数许可配置报错求助
解决Devise 3.2 + Rails 3.2中保存额外参数的问题
首先得明确一个关键背景:Rails 3.2使用attr_accessible做参数白名单,而非Rails 4+引入的强参数(permit方法),这也是你遇到第二个错误的核心原因——Rails 3.2里的HashWithIndifferentAccess根本没有permit方法。结合你的参数嵌套在:member哈希里的情况,我们分两步解决:
步骤1:在Member模型中配置参数白名单
首先要确保你的Member模型允许这些额外属性被批量赋值,打开app/models/member.rb添加以下代码:
class Member < ActiveRecord::Base devise :invitable, :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable # 将需要保存的属性加入白名单 attr_accessible :name, :site_id, :email, :password, :password_confirmation, :invitation_token, :invited_by_id, :invited_by_type end
步骤2:调整ApplicationController的参数处理逻辑
因为你的参数嵌套在:member键下,Devise默认会从顶层参数取值,所以我们要告诉它去嵌套哈希里读取参数,同时适配Rails 3.2的attr_accessible机制。修改app/controllers/application_controller.rb:
class ApplicationController < ActionController::Base before_filter :configure_permitted_parameters, if: :devise_controller? protected def configure_permitted_parameters # 处理注册(sign_up)场景的额外参数 devise_parameter_sanitizer.for(:sign_up) do |sanitizer| sanitizer.fields += [:name, :site_id] end # 处理接受邀请(accept_invitation)场景的额外参数 devise_parameter_sanitizer.for(:accept_invitation) do |sanitizer| sanitizer.fields += [:name, :site_id] end end # 重写Devise获取参数的方法,指定从:member嵌套哈希中读取 def resource_params params.fetch(:member, {}) end end
为什么之前的方法会报错?
- 第一种方法报错
devise base sanitizer expects a Block:Devise 3.2在Rails 3环境下,for(:action)方法需要传入块来修改sanitizer的字段集合,不能直接用<<操作符。 - 第二种方法报错
undefined method permit:permit是Rails 4+强参数的方法,Rails 3.2并不支持,这种block写法是为Rails 4+设计的,自然在Rails 3.2里行不通。
验证效果
现在提交表单时,Devise会通过resource_params获取嵌套在:member里的参数,同时模型的attr_accessible白名单会允许name和site_id被赋值,这样就能成功保存带有这两个属性的Member了。
内容的提问来源于stack exchange,提问作者Rockwell Rice
相关产品推荐
相关产品推荐

