无法创建用户,"undefined method `save' for nil:NilClass" 在 Rails 4 中使用 Devise

Can't create user, "undefined method `save' for nil:NilClass" using Devise in Rails 4

当我尝试创建一个新人时,我在 if @persons.save 行收到以下错误:

PeopleController#create 中没有方法错误, nil:NilClass

的未定义方法“保存”

任何关于如何修复的想法将不胜感激,谢谢。

控制器

  # GET /people/new
  def new
    @person = current_user.person.build
  end

  # GET /people/1/edit
  def edit
  end

  # POST /people
  # POST /people.json
  def create
    @person = current_user.person.build(person_params)

    respond_to do |format|
      if @person.save
        format.html { redirect_to @person, notice: 'Person was successfully created.' }
        format.json { render action: 'show', status: :created, location: @person }
      else
        format.html { render action: 'new' }
        format.json { render json: @person.errors, status: :unprocessable_entity }
      end
    end
  end

用户模型

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :person

end

人物模型

class Person < ActiveRecord::Base
    has_many :user
    has_paper_trail
    acts_as_taggable

    @tags = Person.acts_as_taggable_on :tags

    def admin_permalink
    admin_post_path(self)
  end
end

你似乎想要一个用户可以有很多人,一个人可以有很多用户的关系。

这需要一个名为 has_many through 的特殊关联类型。

基本上一个用户可以关联到很多人,反之亦然,:through 第三种模型称为联接 table。

例如

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :confirmable, :lockable, :timeoutable and :omniauthable
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  has_many :people, through: :relationships # The model name(person) is pluralised for has_many associations

end

class Person < ActiveRecord::Base
  has_many :users, through: :relationships # user needs to be pluralised here
  has_paper_trail
  acts_as_taggable

  @tags = Person.acts_as_taggable_on :tags

  ...
end

class Relationship < ActiveRecord::Base # This is the join table
  belongs_to :user
  belongs_to :person
end

这需要您在数据库中创建 relationship table(而不是关系,将其命名为最有意义的名称)。它需要 person_iduser_id 整数列。

在你的控制器中你也需要使用复数形式:

@person = current_user.people.build(person_params)

您应该好好阅读 rails association guide. Particularly the has_many through 部分。

还有另一种类型的关联称为 has_and_belongs_to_many,它可能更适合您的情况。根据我的经验,与 has_many through.

相比,它通常看起来更容易,但最终会导致头痛