Я использовал комбинацию ответов от 21222015, 17572279, 2663141 и RailsGuide, чтобы попытаться получить несколько взаимозависимых создавать новые модели из формы.Создание двух взаимосвязанных моделей из одной формы в рельсах
В моем приложении Users
используется для аутентификации и Clinicians
и Patients
модель для двух различных типов Users
. Clinicians
и Patients
почти не имеют атрибутов, поэтому создание отдельных моделей имеет смысл.
Я хотел был бы иметь возможность создать patient
или clinician
и user
в то же время на форме. Patients
и clinicians
соединены с их user
полем целых чисел user_id
.
Сейчас 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
has_one
user
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
I A m пытается создать user
и patient
на странице new.html.erb - пациентов с использованием accepts_nested_attributes_for
. Я последовал за RailsCast Nested Model Form Part 1, так как это было рекомендовано в качестве ответа на вопрос SO 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
созданного в то же время?
В конце концов мне нужно создать либо patient
, либо clinician
при создании user
; возможно, сделав это так, чтобы patient/clinician
accepts_nested_attributes_for
a user
и имеют форму для каждого?
Любые советы будут очень благодарны, спасибо
Ах, извините - синтаксис несколько отличается для отношения 'has_one' и' has_many', я обновляю свой ответ. – Hannah
Спасибо @ Ханна, проблема решена – Skiapex
Знаете ли вы, как я сделал бы это так, чтобы либо пациента, либо врача можно было сделать от нового пользователя? сейчас это просто для пациента. Спасибо – Skiapex