我有一个简单的应用程序,用户可以在其中购买物品。在项目页面上将有一个添加到购物车按钮。推车控制器使用REDIS关系显示项目,它没有模型。一旦用户查看了商品并希望购买,他们将被引导到购买视图,一旦他们用条带支付,就会在购买控制器中创建订单。购买控制器也没有模型。
user.rb模型:
class User < ActiveRecord::Base
has_many :orders
def get_cart_items
cart_ids = REDIS.smembers "cart#{id}"
Item.find(cart_ids)
end
def purchase_cart_items!(recipient_name:, recipient_address:)
get_cart_items.each { |item| purchase!(item, recipient_name, recipient_address) }
REDIS.del "cart#{id}"
end
def purchase!(item, recipient_name, recipient_address)
self.orders.create!(user_email: self.email,
item_id: item.id,
recipient_name: recipient_name)
recipient_address: recipient_address)
end
end
购买控制器:
class PurchasesController < ApplicationController
def create
Stripe::Charge.create(
...
)
##########
current_user.purchase_cart_items!(recipient_name:, recipient_address:)
##########
end
end
推车控制器:
class CartsController < ApplicationController
def create
REDIS.sadd current_user_cart, params[:item_id]
end
def destroy
REDIS.srem current_user_cart, params[:item_id]
end
end
通过调用user_email:
和item_id:
可以轻松创建self.email
和item.id
的订单属性,因为它们已附加到模型中,但我不确定如何使用 购物车视图 中的表单,让用户在中为recipient_name:
方法输入recipient_address:
和purchase_cart_items!(recipient_name:, recipient_address:)
个参数购买控制器
我需要:
谢谢!
答案 0 :(得分:0)
需要使用带有GET方法的form_tag
才能将表单信息提交给正确的控制器。
在购物车视图中:
<%= form_tag({controller: "purchases", action: "new"}, method: "get") do %>
<%= label_tag 'recipient name: ' %>
<%= text_field_tag 'recipient_name' %>
<%= label_tag 'recipient address: ' %>
<%= text_field_tag 'recipient_address' %>
<%= submit_tag "PAY" %>
<% end %>
在购买控制器的new
操作中,我使用params
获取表单信息,session
使表单信息可用于同一控制器中的创建操作:
class PurchasesController < ApplicationController
def new
@name = params[:name]
@address = params[:address]
session[:name] = @name
session[:address] = @address
end
def create
Stripe::Charge.create(
...
)
##########
@name = session[:name]
@address = session[:address]
current_user.purchase_cart_destinations!(name: @name, address: @address)
##########
end
end
在purchase-controller的create
操作中可以访问表单信息后,current_user.purchase_cart_items!
的关键字参数很容易使用@name
和@address
的实例变量进行设置