Rails控制器中为Item模型赋值user_id和list_id无效问题
问题原因及解决方案:手动赋值list_id/user_id后仍为nil
核心问题
你在Item模型中添加的attr_accessor :list_id, :user_id是错误操作,它覆盖了Active Record自动生成的关联字段存取方法,导致赋值无法同步到Active Record的属性系统中。
详细解释
- 当你在模型中声明
belongs_to :user和belongs_to :list时,Active Record会自动为user_id、list_id这两个数据库字段生成对应的getter和setter方法,这些方法直接和Active Record内部的属性存储哈希绑定,赋值后会被正确跟踪。 - 手动添加
attr_accessor会创建独立于Active Record系统的纯Ruby实例变量存取方法,你执行@item.list_id = 1时,只是给内存中的@list_id变量赋值,但Active Record用来记录属性的哈希里并没有更新,所以打印@item时显示的是Active Record属性中的nil值。
解决方案
直接删除Item模型中的attr_accessor :list_id, :user_id这一行即可。
修正后的模型代码
# app/models/item.rb class Item < ApplicationRecord belongs_to :user belongs_to :list # 移除attr_accessor声明 ... end
控制器代码无需修改
保留原有的赋值逻辑,此时调用的是Active Record原生的setter方法,赋值后会正确同步到属性系统:
# app/controllers/items_controller.rb def create @item = Item.new(item_params) @item.list_id = 1 @item.user_id = session[:user_id] logger.debug session[:user_id] # => 1 logger.debug @item # => #<Item id: nil, name: "sad", quantity: 1, user_id: 1, list_id: 1, created_at: nil, updated_at: nil> ... end
内容的提问来源于stack exchange,提问作者Meknassih
相关产品推荐
相关产品推荐

