2012-01-27 13 views
0

で関数を呼び出すしようと、私は三つのフィールドuser_idを持つモデルトークンを持っていないメソッドのエラーは、私がのuser_id@tokenオブジェクトをインスタンス化コントローラ.INunique_tokenをPRODUCT_IDとPRODUCT_IDは、私は【選択問題は私に何の方法エラーundefined method tokensを与えないself.tokens.create!(unique_token: Digest::SHA1.hexdigest("random string"))あるunique_tokenフィールドに関数内で、私はランダムな文字列を3回発生し、保存したい場合は、そのオブジェクトにsave_with_payment関数を呼び出すform.Thenから収集値.What私はここで間違っているのですか? User.find(1).tokensまたはProduct.find(1).tokens【選択モデルの関連付けがUser has_many TokensProduct has_many Tokensあるようトン私は達成したい、私はそののuser_idまたはに関連し発生したunique_tokensの一覧を取得できるようにしたいがをPRODUCT_ID。 注:unique_tokenフィールドはもともとTokenモデルからのもので、user_idとproduct_idはrefの主キーです。インスタンス化されたオブジェクト

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 

答えて

2

トークンクラスにトークンメソッドはありません。 3つのトークンを作成しているので、@ tokenインスタンスは必要ありません。 save_with_paymentをクラスメソッドにするだけです。

希望します。

begin/rescueでループを折り返したい場合もあります。それ以外の場合、2番目または3番目の作成!あなたはトークンで終わり、 "new"にリダイレクトされません。

1番目のコメントへの応答: クラスメソッドを使用すると動作しません。あなたは有効な電話をすることはできませんか?トークンのインスタンスのコンテキストではないからです。インスタンスメソッドを使うことはお勧めしません。あなたが行う場合は、トランザクションブロックでラップしたいと思うクラスメソッドのように変更します。

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が返されます。

私は顧客コードをトークンから引き出して(トークンは顧客の作成/取得に気を付けるべきではありません)、それをコントローラアクションに入れます。該当する情報をsave_with_paymentsに渡します。同様に:

self.save_with_payments(customer, attributes) 
    ... 
end 
+0

これはあなたが私が先に追加する必要性を感じていませんでしたコードをコメントアウト追加した上で見れば、それは一種のように、今では未定義と言い、私は前に持っていたコードでintefere有用であると思われるが、メソッドは有効ですか?値buckとstripe_card_tokenもフォームから来ています(Tokens.new(params [; token]))。 – katie

関連する問題