Ruby on rails 插入一条带“的记录”;“查找”或“创建”;另一个控制器内部发生故障
这是我的代码: 类ApplicationControllerRuby on rails 插入一条带“的记录”;“查找”或“创建”;另一个控制器内部发生故障,ruby-on-rails,ruby,database,record,Ruby On Rails,Ruby,Database,Record,这是我的代码: 类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进行查找,而不是在布局创建行中搜索idnil
,@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