2015-12-09 6 views
0

Я пытаюсь создать новый хешированный токен в SQL DB каждый раз, когда запрос на отправку отправляется на URLwww.example.com/emailsig.json. Я использую before_create для запуска функции, которая вызывается, но переменные, созданные в этой функции, не сохраняются в БД. Я новичок в рельсах и не знаю, с чего начать стрелять. Я думаю, что это связано с сильными параметрами?Rails 4 метод before_create не сохраняется в DB

Рельсы Модель

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

Спасибо за ответ, но я просто переименовал все, и это не делает никакой разницы. Кроме того, слово digest используется в учебнике Майкла Хартля почти точно так же. Единственное отличие, которое я вижу, это то, что я пытаюсь использовать его на модели, которая принадлежит пользователю, а не самой пользовательской модели. – P0lska

+0

Я изменил имя переменной с дистрибутива_digest на signaturekey_hash и имел ту же проблему. Затем изменил его на ekeycode, и он сработал. Так что это было имя переменной в конце концов ... Как я могу избежать такого рода вещей в будущем, похоже, что я столкнулся с двумя именами переменных, которые я не должен использовать в своей аварии, но похоже, что это будет постоянный источник головных болей! – P0lska

+0

Я стараюсь не использовать зарезервированные слова - здесь у вас есть список со всеми из них - http://www.rubymagic.org/posts/ruby-and-rails-reserved-words –

0

я получил эту работу, удалив :distribution_digest из attr_accessor

attr_accessor является рубин код (быстро) создать-акцессоры методы в классе. Это все.

Теперь, что отсутствует в качестве объяснения, заключается в том, что при создании какой-либо связи между моделью (Rails) с таблицей базы данных, НИКОГДА, НИКОГДА, НИКОГДА не требуется attr_accessor в вашей модели для создания сеттеров и геттеров, чтобы иметь возможность изменять записи в вашей таблице.

https://stackoverflow.com/a/12938809