Ruby on rails 插入一条带“的记录”;“查找”或“创建”;另一个控制器内部发生故障

Ruby on rails 插入一条带“的记录”;“查找”或“创建”;另一个控制器内部发生故障,ruby-on-rails,ruby,database,record,Ruby On Rails,Ruby,Database,Record,这是我的代码: 类ApplicationController

这是我的代码:

类ApplicationController
def new
    @application = Application.new
end

def create
    @application = Application.new(application_params)
    @layout = Layout.find_or_create_by(application_id: @application.id)

    if @application.save
        redirect_to @application
    else
        render 'new'
    end
end
布局属于:应用程序


当我检查布局表时,它是空的。你能帮我吗?

当你使用新的方法时,比如

@application = Application.new(application_params)
它不会将该记录持久化到db,换句话说,它没有id。您应该使用方法
create

@application = Application.create(application_params)

然后,
@application
将被持久化到db,当您说
查找或创建时,它将使用id进行查找,而不是在布局创建行中搜索id
nil
,@application还没有id。结果,您将“nil”传递给@layout的应用程序\u id,从而使其验证失败。(您在评论中提到了布局的应用程序存在性验证)

因此,在@application保存后创建布局,您就可以开始了

if @application.save
  @layout = Layout.create(application_id: @application.id)

您的模型包含以下验证:

validates :adv_path, presence: true 
validates :start_time, presence: true 
validates :end_time, presence: true
因此,如果没有此值,则无法创建
布局。您必须这样做(使用有用的值):


或者重新考虑对验证器的需要。

Layout类中是否有任何验证?属于:应用程序验证:页面名称,状态:true验证:adv\u路径,状态:true验证:开始时间,状态:true验证:结束时间,状态:true即使这样,它也不会创建记录。。。这似乎是一个示例任务,但我无法完成。谢谢,您的回答帮助我重新思考我的验证。我不得不将“validates”替换为“validate”,如果创建的布局没有
adv\u路径
或开始和结束时间,会发生什么?这是有效的还是会导致代码中其他地方出现问题?是的,“其他东西”是您的其他验证。:)
def create
  @application = Application.new(application_params)

  @layout = Layout.find_or_create_by(application_id: @application.id)  # <== that line
  if ...
    ....
  end
end
def create
  @application = Application.new(application_params)

  @layout = Layout.find_or_create_by(application_id: @application.id)  # <== that line
  if ...
    ....
  end
end
def create
    @application = Application.new(application_params)

    if @application.save
        @layout = @application.layouts.create( ... ) # assuming application has_many :layouts
        redirect_to @application
    else
        render 'new'
    end
end