使用 ruby on rails 将布尔值保存到 postgres 数据库
Posted
技术标签:
【中文标题】使用 ruby on rails 将布尔值保存到 postgres 数据库【英文标题】:saving boolean values to postgres database using ruby on rails 【发布时间】:2018-01-09 13:11:48 【问题描述】:我已经在一个旧的 Rails 项目上工作了一段时间。由于我已经有一段时间没有使用过铁轨了,所以我有点生疏了,一路上需要一些帮助。
问题是我正在向电子商务网站添加提货选项。
后端由active admin
驱动
当客户检查其产品时。 他可以选择在商店取货或寄出。
我希望订单在后端显示产品是应该发送还是在商店取货。
我有点卡在这里,交付选项似乎没有保存到数据库中......如果有人可以帮助我,那就太好了。
这里是提货选项的 html。它位于views/orders/_form.html.erb
<div class="col-md-5 pick-up-buttons" id="country_div">
<li>
<%= f.radio_button :pick_up, "1", checked: false, data: question: "Pick up your items in the store" %>
<%= f.label :pick_up, "Pick up your items in the store" %>
</li>
<li>
<%= f.radio_button :pick_up, "0", checked: true, data: question: "Send the items by mail" %>
<%= f.label :pick_up, "Send the items by mail" %>
</li>
</div>
这是schema.rb
文件的一部分
create_table "orders", force: :cascade do |t|
t.string "name"
t.string "email"
t.text "address"
t.string "city"
t.string "country"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "shipped", default: false
t.boolean "pick_up", default: false
t.string "delivery"
end
这里是orders_controller.rb
class OrdersController < ApplicationController
include CurrentCart
before_action :set_cart, only: [:new, :create]
before_action :set_order, only: [:show, :edit, :destroy]
def index
@orders = Order.all?
end
def new
@images = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg"]
@random_no = rand(5)
@random_image = @images[@random_no]
if @cart.product_items.empty?
redirect_to root_url, notice: 'Your Cart is Empty'
return
end
@order = Order.new
@client_token = Braintree::ClientToken.generate
@del_cost_euro = 20
end
def create
@order = Order.new(order_params)
if @order.save
charge
if @result.success?
@order.add_product_items_from_cart(@cart)
Cart.destroy(session[:cart_id])
session[:cart_id] = nil
OrderNotifier.received(@order).deliver
redirect_to root_url, notice: 'Thank You for Your Order'
else
flash[:error] = 'Please Check Your Cart'
redirect_to root_url, alert: @result.message
@order.destroy
end
else
@client_token = Braintree::ClientToken.generate
render :new
end
end
def show
end
def destroy
@order.destroy
redirect_to root_url, notice: 'Order deleted'
end
private
def set_order
@order = Order.find(params[:id])
end
def order_params
params.require(:order).permit(:name, :email, :address, :city, :country, :pick_up, :delivery)
end
def charge
@result = Braintree::Transaction.sale(
amount: @cart.total_price_usd,
payment_method_nonce: params[:payment_method_nonce] )
end
end
这里是app/admin/order.rb
ActiveAdmin.register Order do
permit_params :shipped
after_update do |order|
OrderNotifier.shipped(@order).deliver if order.shipped
end
show do |order|
panel 'Customer Details' do
attributes_table_for order, :name, :email, :address, :city, :country
end
panel 'Created' do
"#time_ago_in_words order.created_at ago"
end
panel 'Shipped' do
order.shipped
end
panel 'delivery' do
order.pick_up
end
panel 'Order Details' do
table_for(order.product_items) do
column 'Product' do |item|
item.product.title
end
column 'Quantity' do |item|
item.quantity
end
column 'Price Euro' do |item|
number_to_currency item.total_price_eur
end
column 'Price USD' do |item|
number_to_currency item.total_price_usd
end
end
end
panel 'Order Total USD' do
number_to_currency order.total_price_usd
end
panel 'Order Total Euro' do
number_to_currency order.total_price_eur
end
end
【问题讨论】:
你试过使用radio_button_Tag吗? apidock.com/rails/ActionView/Helpers/FormTagHelper/… 另外一件事,您认为单选按钮是否适合此功能?选择下拉菜单不是更好吗? 嗨@GabrielMesquita 不,我没有使用radio_button_Tag
...我不确定这个功能的正确性,也许选择下拉菜单会更好。我有点迷失在这一切中:)你能发布你将如何做到这一点吗??
好的,我会试试的..
出于灵活性考虑,我强烈建议您使用列delivery_type
(字符串)而不是pick_up
(布尔)。然后,您可以使用 validates 确保此 delivery_type
属性的存在,并确保该值有效(使用常量作为白名单)。然后在管理页面中,您可以只显示delivery_type
和相关地址。
【参考方案1】:
所以您想知道产品是在商店取货还是通过电子邮件发送正确?
既然你迷路了,一个更简单的解决方案是:
1 - 将 t.boolean "pick_up" 更改为 t.string "pick_up"
2 - 使用这个http://guides.rubyonrails.org/form_helpers.html#the-select-and-option-tags,创建一个包含这两个选项的列表。
3 - 在您的控制器中保存用户想要的选项。
我认为为了使用单选按钮,您的数据库中必须有两个字段。像这样的:
t.boolean "pick_up" t.boolean "sent_email"
如果用户选择取货,您将收到一个带有真实取货值的参数,然后您可以保存在您的数据库中。所以这也是另一种选择!
希望对你有帮助。
【讨论】:
感谢@GabrielMesquita,我不知道为什么我应该将t.boolean
更改为字符串,因为布尔值要么是真要么是假。数据库将看到 true = 已发送产品或 false = 提取产品。
@codegirl 一个布尔类型,就像你说的,真或假(或 nil,但应该由你的代码/数据库处理)。如果明天你的老板想让你添加另一种送货方式,比如pigeons
,该怎么办?您必须将此布尔列转换为字符串类型并根据其当前值等更新现有数据。看看我要去哪里?您目前正在实现一个可能会变得更大的功能,请立即尝试生成灵活的代码/数据库结构,这样如果出现这种情况,您就不必花费很多精力。
就像@MrYoshiji 所说,字符串更灵活,我认为它可以解决您的问题。如果答案有帮助,请点赞:)以上是关于使用 ruby on rails 将布尔值保存到 postgres 数据库的主要内容,如果未能解决你的问题,请参考以下文章
保存到数据库帖子,但在检查 Ruby on Rails 中的 http 请求之前
Ruby on rails将base64保存为xlsx(或pdf或word)并使用paperclip保存
单击时禁用引导表行并将其保存在 Ruby on Rails 中