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

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,不会让它们被模型使用。

具体解决步骤:

  1. 在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
    
  2. 关于attr_accessor的注意点
    如果recipients是你在Journal模型里用attr_accessor定义的虚拟属性(不是数据库字段),一定要在permit里显式加上它——因为Strong Params默认只会允许模型对应的数据库列,虚拟属性需要手动声明才能被允许。

这样修改后,你的journal参数就会被标记为permitted: true,模型就能正常接收这些参数了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:33:43