1

Вот мои модели:Rails разработать добавлять поля в регистрационной форме при наличии ИППП

class User < ActiveRecord::Base 
    has_one :worker, :class_name => 'Worker', :foreign_key => :worker_id 
    devise :database_authenticatable 
    accepts_nested_attributes_for :worker 
    attr_accessible :worker_id, :email, :password, :password_confirmation, :remember_me, :workers_attributes, :worker_attributes, :name, :worker 
end 
class Worker < User 
devise :database_authenticatable, :registerable 
belongs_to :user 
attr_accessible :name, :worker, :workers 
end 

Я пытаюсь добавить имя поля в форме registretion на http://localhost:3000/workers/sign_up

Вывеска Форме

<h2>Create Worker</h2> 
<%= form_for resource, :as => resource_name, :url => registration_path(resource_name) do |f| %> 

    <%= devise_error_messages! %> 
<table summary="Subject form fields"> 
     <tr> 
     <th>Name:</th> 
     <td><%= f.text_field :name %></td> 
     </tr> 
     <tr> 
    <th><%= f.label :email %></th> 
    <td><%= f.text_field :email %></td> 
    </tr> 
<tr> 
    <th><%= f.label :kodeord %></th> 
    <td><%= f.password_field :password %></td> 
    </tr> 
    <tr> 
    <th><%= f.label :bekraeft_kodeord %></th> 
    <td><%= f.password_field :password_confirmation %></td> 
    </tr> 
    </table> 
    <p><%= f.submit "Create Worker" %></p> 
<% end %> 
<%= render :partial => "devise/shared/links" %> 

Но я получаю ошибку шаблона: Модель работник не отвечает для имени И как мне создать связь между пользователем и рабочим?

С наилучшими пожеланиями, Rails для начинающих

+0

Существуют ли разные виды пользователей? Вам нужно одиночное наследование? Вам нужен доступ к работнику через: user.worker? Просто для меня лучше понять ваш вопрос. – apneadiving

+0

Мне нужен STI, чтобы иметь возможность иметь одну форму для входа, которую могут использовать Рабочие и Компании. Я очень хочу, чтобы иметь возможность отображать разные виды для Рабочих и Компаний. Затем я должен получить доступ к рабочему через user.worker. На моих маршрутах.rb у меня есть devise_for: users,: company,: workers. –

+0

Помог ли мой ответ? – apneadiving

ответ

8

Я надеюсь, что я хорошо понимаю: я думаю, что вы не понимаете концепцию STI еще.

Давайте попробуем сделать его более ясным.

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

class User < ActiveRecord::Base 
    devise :database_authenticatable 
    attr_accessible :email, :password, :password_confirmation, :remember_me  
end 

Чтобы быть действительно STI, вы, чтобы произвести миграцию включить «тип» для вашей модели. Просто введите:

rails g migration add_type_to_users type:string 
rake db:migrate 

Затем установите вам модель, работник, который на самом деле просто:

class Worker < User 
end 

Как вы сделали, включить в свой routes.rb файл:

devise_for :users, :companies, :workers 

Теперь вы» сделанный!

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

Оттуда введите rails c, чтобы запустить консоль.

Теперь попробуйте: User.all.last, вы должны увидеть только что созданную учетную запись с «рабочего» типа

И попробовать: Worker.last, здесь вы найдете самую последнюю учетную запись, созданную.

Пожалуйста, помните: Rails максимально просто :)

+0

спасибо за этот ответ. Это, безусловно, помогло мне понять немного лучше, но у меня есть пара Qs. Какова точка типа в классе пользователей, используется ли она внутренне Devise? С расширением Worker User, в котором контроллер будет обрабатывать дополнительные поля (Worker vs User)?Было бы невозможно, чтобы Devise генерировал оба (рабочий/компания), а затем использовал devise_for без потребности в классе пользователя? благодаря тонну! – Chance

+1

«type» автоматически заполняется Rails, это часть процесса STI, поэтому ничего не существует. Все классы имеют одни и те же поля: это STI (S для Single, T для таблицы). Я для наследования, поэтому вам нужен класс User: это корень. – apneadiving

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