未知属性'电子邮件'尝试创建时的[has_many association]

时间:2017-05-08 17:35:14

标签: ruby-on-rails activerecord rspec associations

我有一个模型User,我已经与has_many建立了belongs_to / posts关联,我试图测试我的在rspec中发布控制器。但是,当我尝试创建属于用户的帖子时,我收到错误:undefined method 'email=' for #<Post:0x00000...>

我正在创建帖子:

before(:each) do
        @user = User.create!({email: "email@gmail.com", password: "password"})
        @post = @user.posts.create!({title: "title", content: "content"})
end

我不确定为什么要为帖子找到email方法,因为没有这种方法存在。 当我尝试在rails控制台中创建新帖子时,我也收到此错误。我可以p = Post.new(...),但是我保存时会收到错误。 (p.save!

当我尝试创建这样的帖子时,我也收到错误:

Post.create({title: "title", content: "content", user_id: 1 })

有谁知道为什么会出现此错误以及如何解决此错误?谢谢!

-

我的帖子模型如下:

class Post < ActiveRecord::Base

  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  belongs_to :user
end

2 个答案:

答案 0 :(得分:1)

根据给定的信息,这是文件的外观:

<强>模型/ user.rb

HtmlImage

<强>模型/ post.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  has_many :posts
end

用户迁移

class Post < ActiveRecord::Base
  belongs_to :user
end

迁移后

class DeviseCreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :name, null: false
      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.inet     :current_sign_in_ip
      t.inet     :last_sign_in_ip

      ## Confirmable
      t.string :confirmation_token
      t.datetime :confirmed_at
      t.datetime :confirmation_sent_at
      t.string :unconfirmed_email

      t.timestamps null: false
    end

    add_index :users, :name
    add_index :users, :email, unique: true
    add_index :users, :reset_password_token, unique: true
    add_index :users, :confirmation_token, unique: true
    add_index :users, :unlock_token, unique: true
  end
end

答案 1 :(得分:1)

Post模型中的这一行导致了问题。默认情况下,devise需要一个电子邮件列,这就是为什么它抱怨它不存在的原因。只需从Post模型中删除该行。

devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable