我在项目控制器中定义付款操作的金额时遇到问题。我试图提取存储在数据库中的商品价格。我尝试了一切。我重读了这个http://guides.rubyonrails.org/action_controller_overview.html,但仍然没有运气。
在物品控制器中:
def pay
# Find the user to pay.
user = User.find( params[:id] )
amount = #I have no idea what to put here
fee = 100
如果我输入一个数字就行了。但是,当我尝试访问存储在数据库中的项目价格时,就会出现问题。
我尝试了各种定义:
@item.price #fail
item_price #fail
Item.find (params: [:price]) #fail
Item.price #fail
#EVERYTHING FAILS
架构:
ActiveRecord::Schema.define(version: 20150127171203) do
create_table "items", force: true do |t|
t.string "name"
t.decimal "price"
t.text "description"
t.integer "booth_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "category_id"
t.integer "user_id"
t.string "image"
t.string "image_two"
end
create_table "users", force: true do |t|
t.string "name"
t.string "email"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.string "password_digest"
t.string "remember_digest"
t.string "activation_digest"
t.boolean "activated", default: false
t.datetime "activated_at"
t.string "reset_digest"
t.datetime "reset_sent_at"
t.boolean "admin", default: false
t.string "avatar"
t.text "about"
t.string "location"
t.string "publishable_key"
t.string "secret_key"
t.string "stripe_user_id"
t.string "currency"
end
(编辑)我也尝试在付费行动中定义项目,但也没有帮助。 ' item = Item.find(params [:id]'
有谁知道正确的方法吗?我觉得这应该很容易,但我遇到了麻烦。
感谢您的考虑和帮助!
答案 0 :(得分:1)
用户如何与商品相关?我问这个是因为如果你使用的是活动记录,那么你在数据库中建立的关联将决定为你创建的方法。您的模型中的用户是has_many
项吗?项目belong_to
是用户吗?在哪种情况下
@user = User.find(1)
你可以找到像
这样的价格@item = @user.items.find(1)
@price = @item.price
好的,我看了你提供的代码here。此示例显示了在用户控制器中定义路由的付费方法,该方法似乎仅设置为接受一次性费用。在上面的评论中,它甚至说要进行一次性付款,所以我们知道这是真的。
即使在这个例子here中,他们也明确表示固定金额。现在我们如何让它变得动态?好吧,看看代码。付费控制器中有一些逻辑不存在吗?
您是否看到正在创建Stripe :: Charge对象?
charge = Stripe::Charge.create(
{
amount: amount,
currency: user.currency,
card: params[:token],
description: "Test Charge via Stripe Connect",
application_fee: fee
},
# Use the user-to-be-paid's access token
# to make the charge.
user.secret_key
)
您可以将此逻辑移至项目模型中。只要将用户作为参数将其称为支付或其他东西。
def pay(user)
amount = self.price
begin
charge = Stripe::Charge.create(
{
amount: amount,
currency: user.currency,
card: user.token,
description: "Test Charge via Stripe Connect",
application_fee: fee
},
# Use the user-to-be-paid's access token
# to make the charge.
user.secret_key
)
flash[:notice] = "Charged successfully! <a target='_blank' rel='connected-account' href='https://dashboard.stripe.com/test/payments/#{charge.id}'>View in dashboard »</a>"
rescue Stripe::CardError => e
error = e.json_body[:error][:message]
flash[:error] = "Charge failed! #{error}"
end
end
然后在您的项目中的某个位置CONTROLLER定义付费方式而不是之前的用户(确保相应地更改路线)。然后调用您刚刚定义的pay方法,这样您就有了价格,并且可以找到当前登录的用户。
def pay
user = User.find(session[:user_id])
item = Item.find(params[:id])
item.pay(user)
redirect "somewhere"
end