2015-04-30 3 views
0

Я использовал комбинацию ответов от 21222015, 17572279, 2663141 и RailsGuide, чтобы попытаться получить несколько взаимозависимых создавать новые модели из формы.Создание двух взаимосвязанных моделей из одной формы в рельсах

В моем приложении Users используется для аутентификации и Clinicians и Patients модель для двух различных типов Users. Clinicians и Patients почти не имеют атрибутов, поэтому создание отдельных моделей имеет смысл.

Я хотел был бы иметь возможность создать patient или clinician и user в то же время на форме. Patients и clinicians соединены с их user полем целых чисел user_id.

Сейчас patients и cliniciansbelongs_touser (patients также belongs_toclinician и clinicianhas_manypatients):

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_oneuserpatient или 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/clinicianaccepts_nested_attributes_for a user и имеют форму для каждого?

Любые советы будут очень благодарны, спасибо

ответ

1

Я думаю, что для того, чтобы ваши patient полой формы, чтобы показать, вы должны сказать @user.build_patient в ваших new действий в вашем UsersController. Это инициализирует пациента, связанного с созданным вами экземпляром пользователя.

В случае это помогает кто-то еще, если отношения между пациентом и пользователем было has_many вместо has_one, то синтаксис будет @user.patient.buildnew действия.

+0

Ах, извините - синтаксис несколько отличается для отношения 'has_one' и' has_many', я обновляю свой ответ. – Hannah

+0

Спасибо @ Ханна, проблема решена – Skiapex

+0

Знаете ли вы, как я сделал бы это так, чтобы либо пациента, либо врача можно было сделать от нового пользователя? сейчас это просто для пациента. Спасибо – Skiapex

Смежные вопросы