2012-01-27 89 views
0

我有三个字段USER_ID模型令牌时,没有方法的错误,PRODUCT_IDunique_token。在控制器我实例化一个@token对象与user_id说明的product_id值从form.Then收集我打电话save_with_payment功能与该对象,函数内我要生成随机字符串的3倍,并保存在unique_token场。问题是self.tokens.create!(unique_token: Digest::SHA1.hexdigest("random string"))给我都没法错误undefined method tokens。什么我在这里做错了吗?澄清你T I要完成,我希望能够检索关联到USER_IDPRODUCT_IDUser.find(1).tokensProduct.find(1).tokens .The模式相伴随而产生unique_tokens的名单User has_many TokensProduct has_many Tokens注意: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

令牌类中没有令牌方法。由于您创建了三个令牌,因此不需要@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 

希望这有助于您。

您可能还想将循环包装在开始/救援中。否则,如果第二个或第三个创建!你最终失去了令牌并重定向到“新”。

对第一条评论的回应: 如果您使用类方法,则不起作用。你不能称有效?因为你不在Token的实例的上下文中。我不建议坚持实例方法。如果你将其更改为一个类的方法,你会想要将它包装在一个事务块:

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事务,如果任何的创造!调用失败并将错误返回给控制器创建操作。

我会从令牌(令牌不应该关心创建/检索客户)拉出客户代码并将其放入控制器操作中。将相关信息传递到save_with_payments。像:

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

这似乎是有益的,但它的代码我以前那种intefere,如果你看一下上面我已经加入注释掉的代码,我不觉得有必要提前加,所以现在说未定义方法是否有效?。buck和stripe_card_token的值也来自表单(Token.new(params [; token]))。现在如何改变它? – katie 2012-01-27 23:20:22

相关问题