我正在使用devise开发一个应用程序,它有多种类型的用户,每种类型都有不同的数据字段。为此,我尝试使用此处应用的想法:http://blog.jeffsaracco.com/ruby-on-rails-polymorphic-user-model-with-devise-authentication。
我的情况与此博客完全一样。我想只有一个登录屏幕,但有多个用户表(每种类型一个),而不是获得一个包含多个空字段的表。
问题在于我试图与示例完全相同,在我的情况下不起作用。
我的模特:
class User < ActiveRecord::Base
belongs_to :type, :polymorphic => true
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
class Patient < ActiveRecord::Base
has_one :user, :as => :type
end
我会把这两个模型放在一起,因为其他模型一段时间也是如此。
控制器:
class PatientsController < ApplicationController
def create
@user = User.new(params[:user])
@patient = Patient.new(patient_params)
@user.type = @patient
if @patient.save
@user.save
redirect_to @patient
else
render 'new'
end
end
我的观点:
<%= form_for @patient, :url => patients_path(@patient), :html => {:method => :post} do |f| %>
<%= f.label :name, "Nome" %><br>
<%= f.text_field :name, placeholder:"Digite o nome do Paciente", required:"", autofocus: true %>
<br>
<%= f.fields_for :user do |u| %>
<%= u.label :email %><br />
<%= u.email_field :email %>
<%= u.label :password %>
<%= u.password_field :password, autocomplete: "off" %>
<%= u.label :password_confirmation %><br />
<%= u.password_field :password_confirmation, autocomplete: "off" %>
<% end %>
<%= f.submit "Ok" %>
<% end %>
我的迁移:
class CreatePatients < ActiveRecord::Migration
def change
create_table :patients do |t|
t.string :name
t.timestamps null: false
end
end
end
class DeviseCreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
## Database authenticatable
t.string :email, null: false, default: ""
t.string :encrypted_password, null: false, default: ""
## Recoverable
t.string :reset_password_token
t.datetime :reset_password_sent_at
## Rememberable
t.datetime :remember_created_at
## Trackable
t.integer :sign_in_count, default: 0, null: false
t.datetime :current_sign_in_at
t.datetime :last_sign_in_at
t.string :current_sign_in_ip
t.string :last_sign_in_ip
## Confirmable
# t.string :confirmation_token
# t.datetime :confirmed_at
# t.datetime :confirmation_sent_at
# t.string :unconfirmed_email # Only if using reconfirmable
t.timestamps null: false
end
add_index :users, :email, unique: true
add_index :users, :reset_password_token, unique: true
end
end
我得到的错误是:
在PatientsController中创建的ActiveModel :: MissingAttributeError #create can&#t; t
写未知属性type_id
我很抱歉这个巨大的帖子,但我不想让我的疑惑保持困惑,因为我正在研究这个问题已经找了很多相关的东西,但没有什么可以解决这个问题。
感谢阅读。