Ruby on rails 4 Rails 4创建方法之前未保存到DB

Ruby on rails 4 Rails 4创建方法之前未保存到DB,ruby-on-rails-4,strong-parameters,before-save,Ruby On Rails 4,Strong Parameters,Before Save,每次向URLwww.example.com/emailsig.json发送Post请求时,我都会尝试为SQL DB创建一个新的哈希令牌。我使用before_create来运行一个函数,该函数正在被调用,但函数中创建的变量没有保存到数据库中。我是rails新手,不知道从哪里开始解决这个问题。我想这可能和强参数有关吧 轨道模型 class Distribution < ActiveRecord::Base belongs_to :user #validates :distributio

每次向URLwww.example.com/emailsig.json发送Post请求时,我都会尝试为SQL DB创建一个新的哈希令牌。我使用before_create来运行一个函数,该函数正在被调用,但函数中创建的变量没有保存到数据库中。我是rails新手,不知道从哪里开始解决这个问题。我想这可能和强参数有关吧

轨道模型

class Distribution < ActiveRecord::Base
  belongs_to :user
  #validates :distribution_digest, presence: true
  attr_accessor :distribution_token, :distribution_digest
  before_create :create_distribution_digest
  validates :signature_id, presence: true

  def Distribution.digest(string)
    cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
                                                  BCrypt::Engine.cost
    BCrypt::Password.create(string, cost: cost)
  end

  # Returns a random token.
  def Distribution.new_token
    SecureRandom.urlsafe_base64
  end

  private

    # Creates and assigns the distribution token and digest.
    # Functions create tokens and hashed tokens as expected.
    def create_distribution_digest
      self.distribution_token  = Distribution.new_token
      self.distribution_digest = Distribution.digest(distribution_token)
    end
end
显示分发摘要为nil的控制台查询

  Distribution.last
  Distribution Load (0.4ms)  SELECT  "distributions".* FROM "distributions"  ORDER BY "distributions"."id" DESC LIMIT 1
=> #<Distribution id: 27, user_id: 2, signature_id: "8", distribution_digest: nil, distributed_at: "2015-12-09 05:01:48", created_at: "2015-12-09 05:01:48", updated_at: "2015-12-09 05:01:48">

似乎列名中的保留字摘要导致了这个问题。我试图将此列重命名为其他列,但一切正常,但使用distribution digest,我甚至无法在rails控制台中添加此属性。尝试重命名此列,它应该会开始工作:

我通过从attr\u访问器中删除:distribution\u digest来完成此工作

attr_accessor是一个ruby代码,用于在类中快速创建setter和getter方法。就这些

现在,缺少的解释是,当您以某种方式在Rails模型和数据库表之间创建链接时,您永远不需要在模型中使用attr_访问器来创建setter和getter,以便能够修改表的记录


谢谢你的回复,但我只是重新命名了一切,这没有任何区别。此外,在迈克尔·哈特尔的教程中,digest这个词的用法几乎完全相同。我能看到的唯一区别是,我试图在属于用户的模型上使用它,而不是用户模型本身。我将变量名从distribution_digest更改为signaturekey_hash,并且遇到了相同的问题。然后把它改成ekeycode,它就成功了。所以它毕竟是变量名。。。我怎样才能避免将来发生这种事情呢?看起来我碰到了两个不应该使用的变量名,但这似乎是一个经常令人头痛的问题!我尽量不使用保留字——这里有一个清单,上面列出了所有保留字-
Started POST "/emailSig.json" for 180.181.247.76 at 2015-12-09 05:01:47 +0000
Processing by DistributionsController#create as JSON
  Parameters: {"signature_id"=>8, "distribution"=>{"signature_id"=>8}}
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1  [["id", 2]]
  Micropost Load (3.2ms)  SELECT  "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? AND "microposts"."id" = ?  ORDER BY "microposts"."created_at" DESC LIMIT 1  [["user_id", 2], ["id", 8]]
   (0.2ms)  begin transaction
blah
pW00Dn7L9p7CnC6BysvImQ
  SQL (1.0ms)  INSERT INTO "distributions" ("signature_id", "distributed_at", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?, ?)  [["signature_id", "8"], ["distributed_at", "2015-12-09 05:01:48.469044"], ["user_id", 2], ["created_at", "2015-12-09 05:01:48.484218"], ["updated_at", "2015-12-09 05:01:48.484218"]]
   (11.8ms)  commit transaction
  Distribution.last
  Distribution Load (0.4ms)  SELECT  "distributions".* FROM "distributions"  ORDER BY "distributions"."id" DESC LIMIT 1
=> #<Distribution id: 27, user_id: 2, signature_id: "8", distribution_digest: nil, distributed_at: "2015-12-09 05:01:48", created_at: "2015-12-09 05:01:48", updated_at: "2015-12-09 05:01:48">