Нет ошибки метода при попытке вызвать функцию с экземпляром объекта - PullRequest
0 голосов
/ 28 января 2012

У меня есть модельный токен с тремя полями user_id, product_id и unique_token . В контроллере я создаю объект @ token с user_id и значения product_id , собранные из формы. Затем я вызываю функцию save_with_payment с этим объектом, где внутри функции я хочу сгенерировать случайную строку 3 раза и сохранить в поле уникального_тока . проблема self.tokens.create!( unique_token: Digest::SHA1.hexdigest("random string") ) не дают мне ошибку метода undefined method tokens. Что я здесь не так делаю? Чтобы уточнить, чего я хочу достичь, я хочу иметь возможность получить список сгенерированных уникальных токенов, связанных с этим user_id или product_id как User.find(1).tokens или Product.find(1).tokens. Ассоциация модели: User has_many Tokens Product has_many Tokens. Примечание: поле unique_token изначально относится к модели токена, user_id и product_id являются просто первичными ключами . Большое спасибо!

def create
  @token=Token.new(params[:token])
  if @token.save_with_payment
    redirect_to :controller => "products", :action => "index"
  else
    redirect_to :action => "new"
  end
end

class Token < ActiveRecord::Base
  require 'digest/sha1'

  def save_with_payment
 #  if valid?
 #   customer = Stripe::Charge.create(amount:buck,:currency => "usd",card:stripe_card_token,:description => "Charge for bucks")
#self.stripe_customer_token = customer.id
    3.times do
      self.tokens.create!(unique_token: Digest::SHA1.hexdigest("random string"))
    end 
    save!
  end
end

1 Ответ

2 голосов
/ 28 января 2012

В классе Token нет метода токенов.Поскольку вы создаете три токена, вам не нужен экземпляр @token.Просто сделайте save_with_payment методом класса:

def create
  if Token.save_with_payment(params[:token])
    redirect_to :controller => "products", :action => "index"
  else
    redirect_to :action => "new"
  end
end

class Token < ActiveRecord::Base
  require 'digest/sha1'

  def self.save_with_payment(attributes)
    attributes.merge!(unique_token: Digest::SHA1.hexdigest("foo"))
    3.times do
      self.create!(attributes)
    end
  end

end

Надеюсь, это поможет.

Возможно, вы также захотите обернуть цикл в начало / спасение.В противном случае, если 2 или 3 создать!не получается, что вы получаете токены и перенаправляете на «новый».

Ответ на первый комментарий: Это не сработает, если вы используете метод класса.Вы не можете назвать действительным?потому что вы не в контексте экземпляра токена.Я не рекомендую придерживаться метода экземпляра.Если вы измените его на метод класса, вы захотите обернуть его в блок транзакции:

def self.save_with_payment(attributes)
  transaction do
    attributes.merge!(unique_token: Digest::SHA1.hexdigest("foo"))
    3.times do
      self.create!(attributes)
    end
  rescue
    false
  end
end

Это должно откатить транзакции SQL, если какая-либо из операций создания!вызовы терпят неудачу и возвращают false контроллеру create action.

Я бы извлек код этого клиента из Token (Token не должен заботиться о создании / получении клиента) и поместил бы его в действие контроллера.Передайте соответствующую информацию в save_with_payments.Нравится:

self.save_with_payments(customer, attributes)
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...