从 rails 中的一种形式创建两个相互依赖的模型
Create two interdependent models from one form in rails
我结合使用了 21222015, 17572279, 2663141, and RailsGuide 的答案来尝试从一个表单中创建多个相互依赖的模型。
在我的应用程序中,Users
用于身份验证,Clinicians
和 Patients
是两种不同类型 Users
的模型。 Clinicians
和 Patients
几乎没有共同的属性,因此创建单独的模型很有意义。
我希望能够在表单上同时创建 patient
或 clinician
和 user
。 Patients
和 clinicians
都通过 user_id
整数字段连接到它们的 user
。
现在patients
和clinicians
belongs_to
一个user
(patients
还有belongs_to
一个clinician
和一个clinician
has_many
patients
):
class Patient < ActiveRecord::Base
belongs_to :clinician
belongs_to :user
def set_user_id_from_user
patient.user_id = user.id
end
before_validation :set_user_id_from_user
end
A user
has_one
patient
或 clinician
:
class User < ActiveRecord::Base
has_secure_password
has_one :patient, :dependent => :destroy
has_one :clinician, :dependent => :destroy
accepts_nested_attributes_for :patient, :allow_destroy => true
accepts_nested_attributes_for :clinician, :allow_destroy => true
validates :email, presence: true
validates_uniqueness_of :email
end
我正在尝试使用 accepts_nested_attributes_for
在 new.html.erb - 患者页面上创建 user
和 patient
。我关注了 RailsCast Nested Model Form Part 1 as it was recommended as an answer to SO question 10058584。这是我的表格:
<%= form_for @user do |form| %>
<p>
<div class="form-group">
<%= form.label :email %>
<%= form.text_field :email, class: "form-control", placeholder: "email address" %>
</div>
<div class="form-group">
<%= form.label :password %>
<%= form.password_field :password, class: "form-control", placeholder: "enter password" %>
</div>
</p>
<%= form.fields_for :patient do |builder| %>
<p>
<div class="form-group">
<%= builder.label :first_name %>
<%= builder.text_field :first_name, class: "form-control", placeholder: "First name" %>
</div>
<div class="form-group">
<%= builder.label :last_name %>
<%= builder.text_field :last_name, class: "form-control", placeholder: "Last name" %>
</div>
<div class="form-group">
<%= builder.label :diagnosis %>
<%= builder.text_field :diagnosis, class: "form-control", placeholder: "Diagnosis" %>
</div>
<div class="form-group">
<%= builder.label :gender_id %>
<%= builder.collection_select :gender_id, Gender.all, :id, :gender_type, :prompt => true, class: "form-control" %>
</div>
<div class="form-group">
<%= builder.label :age %>
<%= builder.text_field :age, class: "form-control", placeholder: "Age" %>
</div>
</p>
<% end %>
<%= form.button 'Create Patient', class: "btn btn-u btn-success" %>
<% end %>
在我的 UsersController
我有:
def new
@user = User.new
end
def create
@user = User.create(user_params)
if @user.save
redirect_to user_path(@user), notice: "User created!"
else
render "new"
end
end
private
def user_params
params.require(:user).permit(:email, :password, patient_attributes: [ :first_name,:last_name,:user_id,:diagnosis,:gender_id,:age,:address, :email, :password, :phone_number, :caregiver_name, :other_symptom, :goals_of_care, :patient_deceased, :patient_archived ])
end
目前所有这些都给我一个只显示两个 user
字段的表单:email
和 password
。提交后,我创建了一个新用户,但没有创建患者。
如何让 patient
字段出现在表单上并创建一个 patient
,其中有一个 user_id
将其连接到在以下位置创建的 user
同一时间?
最终我需要在创建 user
时创建 patient
或 clinician
;也许通过使 patient/clinician
accepts_nested_attributes_for
和 user
并且每个都有表格?
非常感谢任何建议,谢谢
我认为为了显示您的 patient
表单域,您需要在 UsersController
的 new
操作中说 @user.build_patient
。这将初始化与您创建的用户实例关联的患者。
如果对其他人有帮助,如果患者和用户之间的关系是 has_many
而不是 has_one
,那么语法将是 @user.patient.build
thenew
行动。
我结合使用了 21222015, 17572279, 2663141, and RailsGuide 的答案来尝试从一个表单中创建多个相互依赖的模型。
在我的应用程序中,Users
用于身份验证,Clinicians
和 Patients
是两种不同类型 Users
的模型。 Clinicians
和 Patients
几乎没有共同的属性,因此创建单独的模型很有意义。
我希望能够在表单上同时创建 patient
或 clinician
和 user
。 Patients
和 clinicians
都通过 user_id
整数字段连接到它们的 user
。
现在patients
和clinicians
belongs_to
一个user
(patients
还有belongs_to
一个clinician
和一个clinician
has_many
patients
):
class Patient < ActiveRecord::Base
belongs_to :clinician
belongs_to :user
def set_user_id_from_user
patient.user_id = user.id
end
before_validation :set_user_id_from_user
end
A user
has_one
patient
或 clinician
:
class User < ActiveRecord::Base
has_secure_password
has_one :patient, :dependent => :destroy
has_one :clinician, :dependent => :destroy
accepts_nested_attributes_for :patient, :allow_destroy => true
accepts_nested_attributes_for :clinician, :allow_destroy => true
validates :email, presence: true
validates_uniqueness_of :email
end
我正在尝试使用 accepts_nested_attributes_for
在 new.html.erb - 患者页面上创建 user
和 patient
。我关注了 RailsCast Nested Model Form Part 1 as it was recommended as an answer to SO question 10058584。这是我的表格:
<%= form_for @user do |form| %>
<p>
<div class="form-group">
<%= form.label :email %>
<%= form.text_field :email, class: "form-control", placeholder: "email address" %>
</div>
<div class="form-group">
<%= form.label :password %>
<%= form.password_field :password, class: "form-control", placeholder: "enter password" %>
</div>
</p>
<%= form.fields_for :patient do |builder| %>
<p>
<div class="form-group">
<%= builder.label :first_name %>
<%= builder.text_field :first_name, class: "form-control", placeholder: "First name" %>
</div>
<div class="form-group">
<%= builder.label :last_name %>
<%= builder.text_field :last_name, class: "form-control", placeholder: "Last name" %>
</div>
<div class="form-group">
<%= builder.label :diagnosis %>
<%= builder.text_field :diagnosis, class: "form-control", placeholder: "Diagnosis" %>
</div>
<div class="form-group">
<%= builder.label :gender_id %>
<%= builder.collection_select :gender_id, Gender.all, :id, :gender_type, :prompt => true, class: "form-control" %>
</div>
<div class="form-group">
<%= builder.label :age %>
<%= builder.text_field :age, class: "form-control", placeholder: "Age" %>
</div>
</p>
<% end %>
<%= form.button 'Create Patient', class: "btn btn-u btn-success" %>
<% end %>
在我的 UsersController
我有:
def new
@user = User.new
end
def create
@user = User.create(user_params)
if @user.save
redirect_to user_path(@user), notice: "User created!"
else
render "new"
end
end
private
def user_params
params.require(:user).permit(:email, :password, patient_attributes: [ :first_name,:last_name,:user_id,:diagnosis,:gender_id,:age,:address, :email, :password, :phone_number, :caregiver_name, :other_symptom, :goals_of_care, :patient_deceased, :patient_archived ])
end
目前所有这些都给我一个只显示两个 user
字段的表单:email
和 password
。提交后,我创建了一个新用户,但没有创建患者。
如何让 patient
字段出现在表单上并创建一个 patient
,其中有一个 user_id
将其连接到在以下位置创建的 user
同一时间?
最终我需要在创建 user
时创建 patient
或 clinician
;也许通过使 patient/clinician
accepts_nested_attributes_for
和 user
并且每个都有表格?
非常感谢任何建议,谢谢
我认为为了显示您的 patient
表单域,您需要在 UsersController
的 new
操作中说 @user.build_patient
。这将初始化与您创建的用户实例关联的患者。
如果对其他人有帮助,如果患者和用户之间的关系是 has_many
而不是 has_one
,那么语法将是 @user.patient.build
thenew
行动。