Ruby on rails Rails:验证是否存在多个关联中的父\u id
我有一个项目资源,它有许多任务。我希望通过向任务模型添加Ruby on rails Rails:验证是否存在多个关联中的父\u id,ruby-on-rails,validation,models,nested-forms,Ruby On Rails,Validation,Models,Nested Forms,我有一个项目资源,它有许多任务。我希望通过向任务模型添加验证:project\u id的存在,确保每个任务都有一个project\u id 但是,在创建包含任务的新项目时,项目id在记录保存之前不可用,因此我无法使用验证:project\u id的存在 所以我的问题是,如何验证任务模型中是否存在项目id?我想确保每个任务都有一个父任务 class项目:销毁 接受:任务的\u嵌套\u属性,\u,:允许\u销毁=>true 类任务:project 接受:任务的\u嵌套\u属性,\u,:允许\u
验证:project\u id
的存在,确保每个任务都有一个project\u id
但是,在创建包含任务的新项目时,项目id在记录保存之前不可用,因此我无法使用验证:project\u id的存在
所以我的问题是,如何验证任务模型中是否存在项目id?我想确保每个任务都有一个父任务
class项目:销毁
接受:任务的\u嵌套\u属性,\u,:允许\u销毁=>true
类任务
您的项目
类必须定义
accepts_nested_attributes_for :tasks
有关如何制作表单的更多详细信息,请参阅
编辑:
在你的表格中,你应该有如下内容:
class Task < ActiveRecord::Base
belongs_to :project
validate_presence_of :project
end
\u form.html.erb
<% form_for @project do |f| %>
# project fields...
<% f.fields_for :tasks do |builder| %>
<%= render 'task_fields', :f => builder %>
<% end %>
<p><%= link_to_add_fields "Add task", f, :tasks %></p>
<%= f.submit %>
<% end %>
<%= f.label :name, "Task name:" %>
<%= f.text_field :name %>
# task fields...
<%= link_to_remove_fields "Delete task", f, :tasks %>
link\u-to\u-add\u字段
和link\u-to\u-remove\u字段
是应用程序\u-helper中定义的动态添加/删除字段的方法。也许我不明白一些事情,但看起来你在试图欺骗rails。你为什么不这样做呢:
class Task < ActiveRecord::Base
belongs_to :project
validate_presence_of :project
end
类任务
看看这个:
我过去做过的一件事是添加:验证:parent\u id,:on=>:update的存在。不是很好,但它有助于将网络收紧一点。您的代码可以工作:
- 如果您验证:project的存在,那么只要该项目存在,它就会验证。但是如果项目未保存,您仍然可以保存任务
- 如果验证:project\u id的存在,则必须存在整数,表示保存的值
这是rSpec证明了这一点。如果验证:project\u id,则在不保存项目的情况下无法保存任务
class Task < ActiveRecord::Base
belongs_to :project
end
有关最终答案,请参见:
class Project < ActiveRecord::Base
has_many :tasks, :dependent => :destroy, :inverse_of => :project
accepts_nested_attributes_for :tasks, :allow_destroy => true
class Task < ActiveRecord::Base
belongs_to :project
validates_presence_of :project
class项目:destroy,:反向=>:project
接受:任务的\u嵌套\u属性,\u,:允许\u销毁=>true
类任务
如果你问我的话,就不那么优雅了。。。它应该透明地进行验证。我认为您遇到的问题与我处理的问题相同。我有两个模型,Account和User,当创建帐户时,第一个用户是通过@Account.users.build
创建的。用户模型有一个验证:帐户的存在性验证
为了让第一个用户通过验证,我在我的帐户模型中添加了以下代码:
before_validation_on_create :initialize_users
def initialize_users
users.each { |u| u.account = self }
end
实际上,你需要两个:
validates_presence_of project
validates_presence_of project_id
这样,如果数据库中只有2个有效项目,即项目id 99无效,则在以下任一情况下都不会保存任务:
task.project_id = 99
task.save
task.project = Project.new
task.save
我希望这对某人有所帮助。hmn-好问题。因此,当它们一起保存时,它不会先创建项目,然后创建任务?嗯,它首先保存项目,然后结果id进入任务的项目id
。这个问题对我来说没有多大意义。您希望某个任务属于某个项目,而不需要从某个项目开始。。。如何才能为不存在的东西获取id?创建项目时是否通过嵌套表单创建任务?我想将您的答案标记为正确,但复选标记不存在:/Thank deb!这是一个非常古老的问题:但是,你不能进行简单的关联验证的原因是,任务位于:字段中,它们嵌套在:项目表单中。保存时,项目id将不可用于验证,验证将失败。您可以通过简单地删除:project的验证来测试这一点。的:逆_确保关联在保存时保持得体。这完全忽略了创建操作。不好的。使用:反转以确保父对象在保存到嵌套字段时关联。
validates_presence_of project
validates_presence_of project_id
task.project_id = 99
task.save
task.project = Project.new
task.save