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()
)。对于所有这些不同的控制器方法,无论它们是namecreate
还是其他什么,此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