无法使用Rails 4中的Devise为nil:NilClass创建用户“undefined method`save'

时间:2015-03-26 22:26:04

标签: ruby-on-rails ruby-on-rails-4 devise

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

PeopleController中创建的NoMethodError, 未定义的方法`save'代表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

1 个答案:

答案 0 :(得分:1)

您似乎想要一种用户可以拥有多人并且一个人可以拥有多个用户的关系。

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

基本上,用户可以与许多人相关联,反之亦然,:through第三个模型称为连接表。

e.g

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表(而不是关系,将其称为最有意义的任何内容)。它需要person_iduser_id整数列。

在您的控制器中,您还需要使用复数版本:

@person = current_user.people.build(person_params)

你应该好好阅读rails association guide。特别是has_many through部分。

还有另一种称为has_and_belongs_to_many的关联,可能更适合您的情况。根据我的经验,这通常看起来更容易,但与has_many through相比最终导致头痛。