Rails 3.2.2升级至5.1.4:strong params与attr_accessor权限问题
解决Rails 5.1.4中Strong Params的
permitted: false问题 嘿,我来帮你搞定这个问题!你看到的permitted: false是因为Rails从4.x开始引入的Strong Parameters机制在起作用——它要求你明确指定哪些参数是允许被传递给模型的,而你现在的journal参数还没被“放行”呢。
为什么会出现这个情况?
在Rails 3.2.2里,我们用模型里的attr_accessible来控制允许的参数,但升级到5.1.4后,这个机制被废弃了,转而使用控制器层面的Strong Params。如果不在控制器里显式声明允许的参数,Rails就会把这些参数标记为permitted: false,不会让它们被模型使用。
具体解决步骤:
- 在JournalsController里定义Strong Params方法
你需要在控制器里添加一个私有方法,明确列出允许的journal参数,包括数组类型的recipients:class JournalsController < ApplicationController def create # 这里要用定义好的strong params方法,而不是直接用params[:journal] @journal = Journal.new(journal_params) if @journal.save # 处理成功逻辑,比如跳转 redirect_to @journal, notice: 'Journal created successfully.' else render :new end end private def journal_params # require(:journal)确保参数里必须有journal这个key,然后permit列出允许的字段 params.require(:journal).permit(:user_id, :subject, :body, recipients: []) end end - 关于attr_accessor的注意点
如果recipients是你在Journal模型里用attr_accessor定义的虚拟属性(不是数据库字段),一定要在permit里显式加上它——因为Strong Params默认只会允许模型对应的数据库列,虚拟属性需要手动声明才能被允许。
这样修改后,你的journal参数就会被标记为permitted: true,模型就能正常接收这些参数了。
内容的提问来源于stack exchange,提问作者Zia Qamar
相关产品推荐
相关产品推荐

