Rails create动作合并非数据库字段时merge方法失效问题
解决方案
你的代码无法生效是三个问题导致的,按下面步骤修改即可:
User.new()返回的是ActiveRecord模型实例,不是Hash,不存在merge实例方法,直接调用自然无法正常执行- 不需要持久化的
first_name属于模型虚拟属性,没有提前声明的话,ActiveRecord会自动过滤该字段的赋值 - 你的
user_params强参数代码存在语法错误,:name和:email_id之间遗漏了逗号,会直接触发语法异常
1. 声明模型虚拟属性
首先打开app/models/user.rb,用attr_accessor声明非持久化的虚拟字段,不需要修改数据表结构、也不需要执行数据库迁移:
class User < ApplicationRecord # 新增这行声明虚拟属性 attr_accessor :first_name end
2. 修正控制器代码
merge是Hash类的方法,你需要先对强参数返回的参数哈希做合并,再传入User.new,同时修正强参数的语法错误:
# 修正后的create动作逻辑 def create # 先合并参数再初始化模型实例 @user = User.new(user_params.merge(first_name: "xyz")) # 下方保留你原有的保存、响应逻辑即可 if @user.save # 你的业务逻辑 end end # 修正后的强参数方法,补全参数间缺失的逗号 def user_params params.permit(:id, :name, :email_id) end
如果你不习惯写参数合并,也可以在初始化模型后单独给虚拟属性赋值,效果完全一致:
@user = User.new(user_params) @user.first_name = "xyz"
这种写法下first_name的值只会存在于模型实例的生命周期中,不会被写入数据库,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Kumar Nikhil
相关产品推荐
相关产品推荐

