访问rails控制器中的数据库信息

时间:2015-01-29 23:31:04

标签: ruby-on-rails-4 model-view-controller

我在项目控制器中定义付款操作的金额时遇到问题。我试图提取存储在数据库中的商品价格。我尝试了一切。我重读了这个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]'

有谁知道正确的方法吗?我觉得这应该很容易,但我遇到了麻烦。

感谢您的考虑和帮助!

1 个答案:

答案 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 &raquo;</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