无法创建用户,"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_id
和 user_id
整数列。
在你的控制器中你也需要使用复数形式:
@person = current_user.people.build(person_params)
您应该好好阅读 rails association guide. Particularly the has_many through 部分。
还有另一种类型的关联称为 has_and_belongs_to_many,它可能更适合您的情况。根据我的经验,与 has_many through
.
相比,它通常看起来更容易,但最终会导致头痛
当我尝试创建一个新人时,我在 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_id
和 user_id
整数列。
在你的控制器中你也需要使用复数形式:
@person = current_user.people.build(person_params)
您应该好好阅读 rails association guide. Particularly the has_many through 部分。
还有另一种类型的关联称为 has_and_belongs_to_many,它可能更适合您的情况。根据我的经验,与 has_many through
.