2017-08-02 23 views
7

Tôi đã làm việc trên một dự án đường ray cũ một chút. Vì tôi đã không làm việc với đường ray trong một thời gian tôi là một chút gỉ và cần một số trợ giúp trên đường đi.lưu các giá trị boolean vào cơ sở dữ liệu postgres bằng ruby ​​trên đường ray

Điều tôi đang thêm tùy chọn nhận vào trang web Thương mại điện tử.

Backend được thúc đẩy bởi active admin

Khi khách hàng được kiểm tra ra sản phẩm của mình. Anh ấy có tùy chọn để chọn nó trong cửa hàng hoặc gửi nó.

Và tôi muốn thứ tự hiển thị trong phần phụ trợ cho dù sản phẩm có được gửi hay không nếu sản phẩm được chọn tại cửa hàng.

Tôi bị kẹt ở đây và tùy chọn phân phối dường như không được lưu vào cơ sở dữ liệu .... Sẽ thật tuyệt nếu ai đó có thể giúp tôi với điều này.

đây là html cho tùy chọn nhận. nó nằm ở 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> 

và đây là một phần của schema.rb tập tin

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 

Và đây là 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 

Và đây là 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

Bạn đã thử sử dụng radio_button_Tag chưa? https://apidock.com/rails/ActionView/Helpers/FormTagHelper/radio_button_tag –

+0

Một điều khác, bạn có nghĩ rằng nút radio là chính xác cho chức năng này không? Một trình đơn thả xuống được chọn sẽ không tốt hơn? –

+0

Xin chào @GabrielMesquita không, tôi chưa từng sử dụng 'radio_button_Tag' ... Tôi không chắc chắn điều gì là đúng cho chức năng này, có thể trình đơn thả xuống được chọn sẽ tốt hơn.Tôi nhận được loại bị mất trong tất cả này :) Bạn có thể đăng bài như thế nào bạn sẽ làm điều này? – codegirl

Trả lời

2

Vì vậy, bạn muốn biết liệu sản phẩm có được chọn tại cửa hàng hoặc được gửi qua email chính xác không?

Vì bạn đang bị mất, một giải pháp đơn giản sẽ là:

1 - Thay đổi t.boolean "pick_up" để t.string "pick_up"

2 - sử dụng http://guides.rubyonrails.org/form_helpers.html#the-select-and-option-tags này, để tạo ra một danh sách với hai tùy chọn này.

3 - Trong bộ điều khiển lưu tùy chọn người dùng muốn.

Tôi nghĩ rằng để sử dụng nút radio, bạn phải có hai trường trong cơ sở dữ liệu của mình. Một cái gì đó như thế này:

t.boolean "pick_up" t.boolean "sent_email"

nếu người dùng chọn để chọn lên, bạn sẽ nhận được một param với một giá trị đích thực cho nhặt, sau đó bạn có thể tiết kiệm trên cơ sở dữ liệu của bạn. Vì vậy, đây cũng là một lựa chọn khác!

Hy vọng điều đó sẽ hữu ích.

+1

Cảm ơn @GabrielMesquita, tôi không chắc tại sao tôi nên thay đổi 't.boolean' thành chuỗi vì boolean là đúng hoặc sai. Cơ sở dữ liệu sẽ thấy sản phẩm true = sent hoặc false = pick up sản phẩm. – codegirl

+1

@codegirl một kiểu boolean, giống như bạn đã nói, đúng hay sai (hoặc nil nhưng điều đó phải được xử lý bởi mã/DB của bạn). Điều gì xảy ra nếu ngày mai sếp của bạn muốn bạn thêm một loại phân phối khác, hãy nói 'chim bồ câu'? Bạn sẽ phải chuyển đổi cột boolean này thành kiểu chuỗi và cập nhật dữ liệu hiện có tùy thuộc vào giá trị hiện tại của nó, v.v. Xem tôi đang đi đâu? Bạn hiện đang triển khai một tính năng có khả năng trở thành một cái gì đó lớn hơn, cố gắng tạo ra một cấu trúc mã/DB linh hoạt ngay bây giờ để bạn không phải tốn nhiều công sức nếu sự kiện đó đến. – MrYoshiji

+0

Giống như @MrYoshiji nói, chuỗi linh hoạt hơn và tôi nghĩ nó giải quyết được vấn đề của bạn. Nếu câu trả lời đã giúp, xin vui lòng cho một upvote :) –

Các vấn đề liên quan