如何在Ruby on Rails上使用多态用户模型和设计认证

时间:2016-05-17 16:55:53

标签: ruby-on-rails authentication devise polymorphism

我正在使用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

我很抱歉这个巨大的帖子,但我不想让我的疑惑保持困惑,因为我正在研究这个问题已经找了很多相关的东西,但没有什么可以解决这个问题。

感谢阅读。

0 个答案:

没有答案