2015-12-09 93 views
0

我试图每次发送Post请求发送到一个URLwww.example.com/emailsig.json时创建一个新的散列令牌到SQL DB。我正在使用before_create来运行正在调用的函数,但函数中创建的变量没有保存到数据库中。我是新来的铁杆,并不知道从哪里开始解决这个问题。我认为这可能与强参数有关?Rails 4 before_create方法不保存到数据库

滑轨模型

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 

滑轨控制器

class DistributionsController < ApplicationController 
    before_action :logged_in_user, only: [:email_sig] 

    def create 
    if current_user.microposts.find(params[:signature_id]) 
     @distribution = current_user.distributions.build(distribution_params) 
     @distribution.save 
     respond_with current_user.microposts.find(params[:signature_id]) 
    end 
    end 

    private 

    def distribution_params 
     params.require(:distribution).permit(:signature_id).merge(:distributed_at => Time.zone.now) 
    end 

end 

服务器日志

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_digest无)

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"> 

回答

0

列名中的保留字digest似乎会导致此问题。我试图将此列重命名为sth_else,并且所有内容都正常工作,但是使用distribution_digest我甚至无法在rails控制台中添加此属性。尝试重命名此列,它应该开始工作:)

+0

感谢您的答复,但我只是改名的一切,它不作出任何差别。另外,Michael Hartl教程中使用的摘要一词几乎完全相同。唯一不同的是我可以看到我试图在属于用户的模型上使用它,而不是用户模型本身。 – P0lska

+0

我将变量名称从distribution_digest更改为signaturekey_hash并具有相同的问题。然后将其更改为ekeycode并运行。所以它毕竟是变量名...我今后如何避免这种事情,它看起来像碰到了2个变量名,我不应该使用我的意外,但是这看起来像是一个常量源的头痛! – P0lska

+0

我尽量不要使用保留字 - 在这里你有一个所有的列表 - http://www.rubymagic.org/posts/ruby-and-rails-reserved-words –

0

我从attr_accessor

attr_accessor得到了这个工作通过去除:distribution_digest是红宝石代码(快速)创建一个类的setter和getter方法。就这样。

现在,缺少的一个解释是,当您创建某个(数据库表)(Rails)模型之间的链接时,您永远不会在模型中不需要attr_accessor来创建setter和getters能够修改你的表格记录。

https://stackoverflow.com/a/12938809

相关问题