Ruby on rails 在创建isn之前';行不通

Ruby on rails 在创建isn之前';行不通,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,在我的文章模型文件中,我有: before_create :generate_token validates :token, presence: true private def generate_token self.token = SecureRandom.urlsafe_base64 end 在我的迁移中: t.string :token, null: false 但是现在创建文章的测试失败了,原因是ActiveRecord::RecordInvalid:验证失败:令牌不能为空

在我的
文章
模型文件中,我有:

before_create   :generate_token
validates :token, presence: true
private
def generate_token
  self.token = SecureRandom.urlsafe_base64
end
在我的迁移中:

t.string :token, null: false

但是现在创建文章的测试失败了,原因是
ActiveRecord::RecordInvalid:验证失败:令牌不能为空。在这些测试中,我确实没有给出
标记的值。但是,上面的
before\u create
方法不应该自动执行此操作吗?它涉及为新作者调用
create
方法的测试,其中controller方法包括行
@author.articles.create(因此没有文章的标记值)


另外,我将
调试器
放在
生成令牌
方法的顶部,并且它不会为任何测试触发。

尝试将
在创建之前
更改为
在验证之前

验证前:在::create上生成\u令牌


它将在您希望的时间触发,并且仅在初始创建时触发,而不是每次保存时触发。

@author.articles.create不创建文章<代码>创建@author
对象上调用code>。谢谢,然后它确实会启动。但是,它会不会不仅在创建新记录时,而且在每次保存现有记录时,都创建一个新令牌呢?谢谢!我想知道关于::create
。在我的
Author
模型中有多个方法可以创建新的作者,并且在同一个控制器方法中为该作者创建第一篇/新文章(
@Author.articles.create()
)。对于所有这些不同的控制器方法,无论它们是name
create
还是其他什么,此before操作是否会自动触发?该
create
回调针对的是对象,而不是方法。为了初始化/调用对象,必须创建它。这就是
ActiveRecord
调用“create”时要查找的内容。有关此方法的详细说明,请参见文档
#app/models/article.rb
class Article < ActiveRecord::Base
   before_validation :generate_token, on: :create
   validates :token, presence: true

   private

   def generate_token
        self.token = loop do
            random_token = SecureRandom.urlsafe_base64
            break random_token unless self.class.exists? random_token
        end
   end
end
#Gemfile
gem "has_secure_token" #-> not needed for Rails 5

#app/models/article.rb
class Article < ActiveRecord::Base
   has_secure_token
end