ruby-on-rails - refinery - ruby on rails cms



Speichern von booleschen Werten in der Postgres-Datenbank mit Ruby on Rails (1)

Ich arbeite jetzt schon an einem alten Schienenprojekt. Da ich seit einiger Zeit nicht mehr mit Schienen arbeite, bin ich etwas eingerostet und brauche unterwegs Hilfe.

Die Sache ist, dass ich eine Abholoption zu einem E-Commerce-Web hinzufüge.

Das Backend wird von active admin gesteuert

Wenn der Kunde sein Produkt auscheckt. Er erhält die Option, sie im Geschäft abzuholen oder zu versenden.

Und ich möchte, dass die Bestellung im Backend anzeigt, ob das Produkt gesendet werden soll oder ob es im Laden abgeholt wird.

Ich stehe hier fest, und die Lieferoptionen scheinen nicht in der Datenbank zu speichern .... Es wäre so schön, wenn mir jemand dabei helfen könnte.

Hier ist der HTML-Code für die Abholoption. Es befindet sich in den 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> 

und hier ist ein Teil der schema.rb Datei

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

Und hier ist der 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

Und hier ist die 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

Sie möchten also wissen, ob das Produkt im Laden abgeholt oder per E-Mail versendet wird?

Da du verloren bist, wäre eine einfachere Lösung:

1 - Ändere den t.boolean "pick_up" zu t.string "pick_up"

2 - Verwenden Sie diese http://guides.rubyonrails.org/form_helpers.html#the-select-and-option-tags , um eine Liste mit diesen beiden Optionen zu erstellen.

3 - Speichern Sie in Ihrem Controller die Option, die der Benutzer möchte.

Ich denke, dass Sie zwei Felder in Ihrer Datenbank haben müssen, um Optionsfelder zu verwenden. Etwas wie das:

t.boolean "pick_up" t.boolean "send_email"

Wenn der Benutzer sich für die Abholung entscheidet, erhalten Sie einen Parameter mit einem echten Wert für die Abholung, dann können Sie Ihre Datenbank speichern. Das ist also eine weitere Option!

Ich hoffe es hilft.





e-commerce