Rails 3 - правильный способ присвоения идентификатора для модели own_to - PullRequest
2 голосов
/ 15 марта 2012

У меня есть две модели: Пользователь и Учитель :

class User < ActiveRecord::Base
  attr_accessor   :password                                                               
  attr_accessible :user_login,                                                           
                  :user_role,
                  :password,
                  :teacher_attributes

  has_one :teacher
  accepts_nested_attributes_for :teacher                                                  
end

# Table name: teachers
#
#  id                  :integer         not null, primary key
#  user_id             :integer
#  teacher_last_name   :string(255)
#  teacher_first_name  :string(255)
#  teacher_middle_name :string(255)
#  teacher_birthday    :date
#  teacher_sex         :string(255)
#  teacher_category    :string(255)
#  created_at          :datetime
#  updated_at          :datetime

class Teacher < ActiveRecord::Base
  attr_accessible :teacher_last_name,
                  :teacher_first_name,
                  :teacher_middle_name,
                  :teacher_birthday,
                  :teacher_sex,
                  :teacher_category

  belongs_to :user
end

Также у меня в контроллере есть метод, который должен создать пользователя, а затем нового учителя. Но не работает правильно, потому что я не пропускаю id.

Мой контроллер

class AdminsController < ApplicationController
  def create_teacher
    user_errors, teacher_errors, redirect_path = nil, nil, nil 

    params[:user][:user_role] = "teacher"
    user = User.new(params[:user])                           #Problem is here

    if user.save
      redirect_path = admins_users_of_system_path
      flash[:success] = "Teacher created!"
    else
      redirect_path = admins_new_teacher_path
      user_errors = user.errors.full_messages.to_sentence                                     
      teacher_errors = user.teacher.errors.full_messages.to_sentence if user.teacher
    end

    errors_arr = [user_errors, teacher_errors].compact
    flash[:error] = errors_arr if errors_arr.present? 
    redirect_to redirect_path
  end
end

У меня такой код в контроллере, потому что я хочу получить все ошибки от пользователя и учителя.

Error

["Teacher user can't be blank", "User can't be blank"]

utf8: ✓
authenticity_token: Hsw9BGOMb37cku6R2aAZsXkYaU5DFZqlUML4yZjqxI0=
user: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
  teacher_attributes: !ruby/hash:ActiveSupport::HashWithIndifferentAccess
    teacher_last_name: Popov
    teacher_first_name: Igor
    teacher_middle_name: Yurevich
    teacher_sex: m
    teacher_birthday: 28.08.1991
    teacher_category: Something 1
  user_login: schoolh_MXWTQ
  password: eviRDyalXnHlK6q
  user_role: teacher
commit: Создать
controller: admins
action: create_teacher

Как правильно создать учителя и пользователя одновременно? Как мне передать это идентификатор?

Ответы [ 3 ]

1 голос
/ 15 марта 2012

Другой подход к этому - просто создать пользователя на первом круге, включая роль учителя. Затем администратор заполняет вторую форму данными профиля, если хотите, «Заполните свой профиль» (модель учителя все равно будет содержать это).

В любом случае, вам, вероятно, понадобится метод Delegates_to для доступа к методам http://apidock.com/rails/v3.1.0/Module/delegate

Кроме того, как бы вы это ни делали, вы можете просто не включать attr_accessible, пока все не будет работать должным образом.

Но если вы найдете способ создать их обоих одновременно, я буду первым, кто вас скопирует!

0 голосов
/ 15 марта 2012

Редактировать: Как я уже сказал в комментарии:

Попробуйте:

user = User.create(params[:user])

вместо User.new

0 голосов
/ 15 марта 2012

Я думаю, что это параметры, которые вы дали неправильно. правильный путь должен быть: params [: user] ['user_role'] = "teacher"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...