Ruby on rails 正在创建与关联相关的对象,验证失败:类必须存在

Ruby on rails 正在创建与关联相关的对象,验证失败:类必须存在,ruby-on-rails,Ruby On Rails,我是RubyonRails的新手,通过建立一个网站来学习RubyonRails,但是我已经在这个特定的问题上呆了很长一段时间了 在我的设置中,我有两种型号: class Project < ApplicationRecord belongs_to :user#, foreign_key: "owner_id", primary_key: "user_id", class_name "User" end class User < ApplicationRecord has

我是RubyonRails的新手,通过建立一个网站来学习RubyonRails,但是我已经在这个特定的问题上呆了很长一段时间了

在我的设置中,我有两种型号:

class Project < ApplicationRecord
    belongs_to :user#, foreign_key: "owner_id", primary_key: "user_id", class_name "User"
end

class User < ApplicationRecord
  has_many :projects#, dependent: :destroy, foreign_key: "projects", primary_key: "project_id"
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
end
它给我的
验证失败:用户必须存在
错误。我可以确认用户确实存在,它在数据库中,并且控制器在\u操作之前有
:验证\u用户,当我执行
放置@user.attributes时,它会正确显示详细信息


如果可能的话,我真的不想对归属关联使用
可选:true
,因为在没有所有者的情况下创建项目是没有意义的,除非这是处理问题的标准方法。任何关于创建方法的指导都将不胜感激

属于默认情况下需要的关联是一个相对较新且不受欢迎的更改,我可以说作为Rails的老手,您可能只想在学习时禁用它。如果您想在全球范围内实现这一点,可以将其添加到application.rb中

config.active\u record.properties\u to\u required\u默认为false

就控制器中的代码而言。。。试试这个

 def create
   @project = Project.new(project_params)
   @project.user_id = current_user.id

   # assuming you used scaffolding, these paths will work
   # you can render/redirect anywhere you want after creating a project though
   if @project.save
     redirect_to @project
   else
     redirect_to new_project_path
   end

 end

您是否在路线中添加了
设计?请在此处找到当前用户,并查看example@noname谢谢你的评论!是的,它在我的routes.rb中,当我在create方法中正确显示@users.attributes时,
,因此我假设用户确实存在。您可能还可以将前两行组合到
@project=project.new(project\u参数,user\u id:current\u user.id)
中,但我没有尝试过,但我很确定它会很好。我明白了,我本来是这样做的,而且很管用,但我想看看并了解是否有一种方法可以满足需要。如果我找不到解决方案而放弃,我会选择这个作为公认的答案,非常感谢你的建议!您是否尝试了新的控制器操作?这可能会解决你的问题,而不会改变你所属的任何东西。啊,对不起,我第一次读到这篇文章时一定是误解了。它工作得很好:D你知道为什么这个能工作,而不是我的吗?不管怎样,非常感谢!!
 def create
   @project = Project.new(project_params)
   @project.user_id = current_user.id

   # assuming you used scaffolding, these paths will work
   # you can render/redirect anywhere you want after creating a project though
   if @project.save
     redirect_to @project
   else
     redirect_to new_project_path
   end

 end