当有STI时,Rails设计为注册表单添加字段

时间:2011-01-11 16:44:05

标签: ruby-on-rails ruby ruby-on-rails-3 devise single-table-inheritance

这是我的模特:

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

我正在尝试将字段名称添加到注册表单中 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" %>

但是我收到模板错误:Model Worker没有响应名称 我如何创建用户和工作者之间的关联?

祝你好运, Rails初学者

1 个答案:

答案 0 :(得分:8)

我希望我能理解:我认为你还没有理解STI概念。

让我们试着让它更清楚。

从orinal模型派生的类继承了它的所有内容。您的原始模型应如下所示:

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

要真正成为STI,您必须生成迁移以在模型中包含“type”。只需输入:

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非常简单:)