2017-08-02 8 views
7

Pracuję już nad starym projektem szyn. Ponieważ od jakiegoś czasu nie pracuję z szynami, jestem trochę zardzewiały i potrzebuję pomocy po drodze.zapisywanie wartości logicznych do bazy danych postgres za pomocą ruby ​​na szynach

Chodzi o to, że dodam opcje odbioru do internetowej e-commerce.

Backend jest napędzany przez active admin

Kiedy klient jest sprawdzanie swojego produktu. Dostaje opcję odebrania go w sklepie lub wysłania.

Chcę, aby zamówienie pokazywało w zapleczu, czy produkt powinien zostać wysłany, czy też odebrany w sklepie.

Trochę utknąłem tutaj, a opcje dostawy nie wydają się zapisywać w bazie danych ... Byłoby miło, gdyby ktoś mógł mi w tym pomóc.

tutaj jest html dla opcji odbioru. to znajduje się w 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> 

i tutaj jest częścią pliku

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 

I tu schema.rb jest 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 

A oto 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 
+0

Czy próbowałeś użyć radio_button_Tag? https://apidock.com/rails/ActionView/Helpers/FormTagHelper/radio_button_tag –

+0

Jeszcze jedno, czy uważasz, że przycisk radiowy jest prawidłowy dla tej funkcji? Wybrane menu nie byłoby lepsze? –

+0

Witam @GabrielMesquita no Nie użyłem 'radio_button_Tag' ... Nie jestem pewien, co jest poprawne dla tej funkcjonalności, może lista wyboru będzie lepsza.Zgubiłem się w tym wszystkim :) Czy mógłbyś napisać, jak byś to zrobił? – codegirl

Odpowiedz

2

Chcesz się dowiedzieć, czy produkt zostanie odebrany w sklepie, czy wysłany e-mailem?

Ponieważ jesteś zgubiony, prostszym rozwiązaniem byłoby:

1 - Zmiana t.boolean "pick_up" do t.string "pick_up"

2 - użyć tego http://guides.rubyonrails.org/form_helpers.html#the-select-and-option-tags, aby utworzyć listę z tymi dwiema opcjami.

3 - W sterowniku zapisz opcję, której chce użytkownik.

Myślę, że aby użyć przycisków radiowych, musisz mieć dwa pola w bazie danych. Coś takiego:

t.boolean „pick_up” t.boolean „sent_email”

jeśli użytkownik zdecydować się podnieść, otrzymasz param z prawdziwej wartości dla podnieść, a następnie można zapisać na twojej bazie danych. To także inna opcja!

Mam nadzieję, że to pomaga.

+1

Dzięki @GabrielMesquita, nie jestem pewien, dlaczego powinienem zmienić 't.boolean' na ciąg znaków, ponieważ boolean ma wartość true lub false. Baza danych zobaczy albo true = wysłany produkt, albo false = pobranie produktów. – codegirl

+1

@codegirl typu boolean jest, jak powiedziałeś, true lub false (lub zero, ale powinno być obsługiwane przez twój kod/DB). Co jeśli jutro twój szef chce, żebyś dodał inny rodzaj dostawy, powiedzmy "gołębie"? Konieczne byłoby przekonwertowanie tej kolumny boolowskiej na typ łańcucha i zaktualizowanie istniejących danych w zależności od jej bieżącej wartości itd. Zobacz, dokąd zmierzam? Obecnie wdrażasz funkcję, która potencjalnie może stać się czymś większym, spróbuj teraz stworzyć elastyczną strukturę kodu/DB, więc nie będziesz musiał poświęcać dużo czasu, jeśli pojawi się taka możliwość. – MrYoshiji

+0

Jak powiedział @MrYoshiji, ciąg jest bardziej elastyczny i myślę, że rozwiązuje twój problem. Jeśli odpowiedź na to pytanie pomogła, proszę oddać głos :) –

Powiązane problemy