current_user.user_type_id = @employer ID - PullRequest
0 голосов
/ 09 июня 2010

Я строю систему с моделью User (аутентифицированной с использованием AuthLogic) и тремя типами пользователей в трех моделях: одна из этих моделей - Employer.У каждой из этих трех моделей есть has_many: users,: as =>: authenticable.

Я начинаю с того, что новый посетитель сайта создает свою собственную запись «User» с именем пользователя, паролем, типом пользователя, которым они являются,и т. д.

После создания пользователь отправляется в действие «новое» для одной из трех моделей.Так что, если они скажут нам, что являются работодателем, мы redirect_to: controller => "работодатели,: action =>" new ".

Вопрос: Когда работодатель подал заявку, я хочуустановить значение current_user.user_type_id равным идентификатору работодателя. Это должно быть просто ... но это не работает.

# Employers Controller / new
def new
  @employer = Employer.new
  1.times {@employer.addresses.build}
  render :layout => 'forms'
end

# Employers Controller / create
def create
  @employer = Employer.new(params[:employer])
  if @employer.save
    if current_user.blank?
      redirect_to :controller => "users", :action => "new"
    else
      current_user.user_type_id = @employer.id
      current_user.user_type = "Employer"
      redirect_to :action => "home", :id => current_user.user_type_id
    end
  else
    render :action => "new"
  end
end

------ ОБНОВЛЕНИЕ ------

Привет, ребята. В ответ:

Я использую эту структуру таблицы, потому что каждая из моих трех моделей пользовательских типов имеет много разных полей, и каждая имеет разные отношения с другими моделями, которыеВот почему я избегаю STI.

By 1.times (@ Employer.addresses.build) Я подключаю модель работодателя к полиморфной таблице адресов в одной форме, поэтому я прошу контроллер:создайте новый адрес, чтобы идти вместе с новым работодателем.

Averell: вы упомянули инкапсуляцию ... что-то в модели с помощью метода «сеттера». Я понятия не имею, что вы подразумеваете под этим - не могли бы вы, пожалуйстаобъясните как это работает (или приведите мне примерв другом месте)?С ответом tsdbrown мне удалось создать поведение, которое я хочу ... если есть более элегантный способ выполнить то же самое, что я хотел бы узнать, как.

Большое спасибо.

Спасибо tsdbrown за ответ на проблему current_user.save!

Ответы [ 2 ]

2 голосов
/ 09 июня 2010

Вы устанавливаете его на объект current_user, затем перенаправляете.Я полагаю, что при перенаправлении ваше приложение перезагрузит current_user, и в этом случае оно исчезнет, ​​поскольку вы его не сохранили.(вызовите current_user.save перед перенаправлением, если вы хотите сохранить его). Вы передаете Employer.id/current_user.user_type_id в домашнее действие, поэтому оно должно быть там, чтобы вы могли продолжить с параметрами [: id]

Это помогает?Если нет, то, возможно, я не понимаю ваш вопрос.

1 голос
/ 09 июня 2010

Как уже было сказано, ваша непосредственная проблема в том, что вы не сохраняете запись.Тем не менее, ваша модель выглядит немного неуклюже, ссылаясь на разные таблицы в зависимости от поля типа.

Мои спонтанные идеи - рассмотреть

  • Наличие «пользователя» в качестве модели STI
  • Наличие «UserType» в качестве модели STI
  • Наличие явного отношения (то есть использование отдельного поля в пользовательской модели) между ним и каждым изтипы пользователей

Если вы действительно хотите придерживаться своего подхода , он должен быть как минимум инкапсулирован в модель, поэтому вы передаете объект типа пользователя (например, сотрудник) и все поляустанавливаются автоматически в методе сеттера. вам следует использовать полиморфные ассоциации Rails.

Кроме того, я не совсем уверен, чего вы хотите достичь:

1.times {@employer.addresses.build}

Отредактировано -Полиморфные ассоциации

Rails фактически предоставляют нужную вам функцию из коробки.Проверьте документацию для функций здесь. .Прежде чем публиковать больше примеров, вы можете взглянуть на этот вопрос , который очень похож на то, что вы хотите сделать.

...