我似乎无法与accepts_nested_attributes_for建立一个has_one关系。这是我第一次涉足嵌套属性,因此可能不正确。救命啊!
型号:
class Case < ActiveRecord::Base
has_one :logged_event, class_name: 'Event', dependent: :destroy
accepts_nested_attributes_for :logged_event
end
class Event < ActiveRecord::Base
belongs_to :case
belongs_to :user
validates :case, presence: true
validates :user, presence: true
end
控制器:
class CasesController < ApplicationController
load_and_authorize_resource
def new
@case.build_logged_event(user: current_user)
end
def create
if @case.save
flash[:notice] = 'Case was successfully logged.'
redirect_to cases_path
else
render 'cases/new'
end
end
end
形式:
<h1>New Case</h1>
<%= error_messages_for :case %>
<%= form_for(@case) do |form| %>
<p>
<%= form.label(:study) %>:
<%= form.select(:study, Case.options_for(:study), include_blank: true) %>
</p>
<%= form.fields_for(:logged_event) do |logged_event_form| %>
<%= logged_event_form.label(:created_at, 'Date Case was opened:') %>
<%= logged_event_form.select(:created_at, [['Today', Date.today], ['Yesterday', Date.yesterday]]) %>
<% end %>
<%= form.submit('Log Case') %> or <%= link_to('cancel', cases_path) %>
<% end %>
它表示记录的事件没有获得用户ID或案例ID,因此事件类的两个验证都失败了。它看起来像:
以下字段存在问题:
记录的事件案例不能为空白
记录的事件用户不能为空
我不明白,因为在新动作中我已经构建了对象。我也尝试了form.fields_for(:logged_event, @case.logged_event)
,但这也没有用。
答案 0 :(得分:0)
这是因为提交表单时没有调用new
。仅运行create
操作。因此@case
仅填充for提交数据;没有用户或案例分配给它,因为它不在表单中。
在尝试保存(并运行验证)之前,您需要指定user
的{{1}}和case
属性
答案 1 :(得分:0)
原则上你不应该双方都进行验证。我正在验证一个案件有一个事件,一个事件有案件。通过从事件中删除validates :case, presence: true
之类的内容,一切都按原样运行。
答案 2 :(得分:0)
您不需要删除验证 - 您只需要在关联声明中添加inverse_of
,告诉Rails为您管理反向引用。
您的模型应如下所示:
class Case < ActiveRecord::Base
has_one :logged_event, class_name: 'Event', dependent: :destroy, inverse_of: :case
accepts_nested_attributes_for :logged_event
end
class Event < ActiveRecord::Base
belongs_to :case, inverse_of: :logged_event
belongs_to :user, inverse_of: :logged_event # or inverse_of: :event -- you didn't provide your User model
validates :case, presence: true
validates :user, presence: true
end