2014-08-29 34 views
-1

結帳後我們有一個表格填寫用​​戶的數據,如果填不滿我們會出現錯誤,填充數據後如果我們點擊了Place Order,假設這會是數據庫的更新,但所有數據都從表單中消失,並且像第一次顯示錯誤一樣沒有數據。敏捷網站開發4 with rails 4訂單表

這裏是我的代碼:

/app/views/carts/_cart.html.erb:

<h2>Your Cart</h2> 
<table> 
    <%= render(cart.line_items) %> 

    <tr class="total_line"> 
    <td colspan="2">Total</td> 
    <td class="total_cell"><%= number_to_currency(cart.total_price) %></td> 
    </tr> 

</table> 

<!-- START_HIGHLIGHT --> 
<%= button_to "Checkout", new_order_path, method: :get %> 
<!-- END_HIGHLIGHT --> 
<%= button_to 'Empty cart', cart, method: :delete, 
    data: { confirm: 'Are you sure?' } %> 

/app/controllers/orders_controller.rb:

class OrdersController < ApplicationController 
    include CurrentCart 
    before_action :set_cart, only: [:new, :create] 
    before_action :set_order, only: [:show, :edit, :update, :destroy] 

    # GET /orders 
    # GET /orders.json 
    def index 
    @orders = Order.all 
    end 

    # GET /orders/1 
    # GET /orders/1.json 
    def show 
    end 

    # GET /orders/new 
    def new 
    if @cart.line_items.empty? 
     redirect_to store_url, notice: "Your cart is empty" 
     return 
    end 

    @order = Order.new 
    end 

    # GET /orders/1/edit 
    def edit 
    end 

    # POST /orders 
    # POST /orders.json 
    def create 
    @order = Order.new(order_params) 
    @order.add_line_items_from_cart(@cart) 

    respond_to do |format| 
     if @order.save 
     Cart.destroy(session[:cart_id]) 
     session[:cart_id] = nil 

     format.html { redirect_to store_url, notice: 
      'Thank you for your order.' } 
     format.json { render action: 'show', status: :created, 
      location: @order } 

     else 
     format.html { render action: 'new' } 
     format.json { render json: @order.errors, 
      status: :unprocessable_entity } 
     end 
    end 
    end 

    # PATCH/PUT /orders/1 
    # PATCH/PUT /orders/1.json 
    def update 
    respond_to do |format| 
     if @order.update(order_params) 
     format.html { redirect_to @order, notice: 'Order was successfully updated.' } 
     format.json { head :no_content } 
     else 
     format.html { render action: 'edit' } 
     format.json { render json: @order.errors, status: :unprocessable_entity } 
     end 
    end 
    end 

    # DELETE /orders/1 
    # DELETE /orders/1.json 
    def destroy 
    @order.destroy 
    respond_to do |format| 
     format.html { redirect_to orders_url } 
     format.json { head :no_content } 
    end 
    end 

    private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_order 
     @order = Order.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def order_params 
     params.require(:order).permit(:name, :address, :email, :pay_type) 
    end 
    #... 
end 

/app/views/orders/new.html.erb:

<div class="depot_form"> 
    <fieldset> 
    <legend>Please Enter Your Details</legend> 
    <%= render 'form' %> 
    </fieldset> 
</div> 

/app/views/orders/_form.html.erb:

<%= form_for(@order) do |f| %> 
    <% if @order.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@order.errors.count, "error") %> 
     prohibited this order from being saved:</h2> 

     <ul> 
     <% @order.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br> 
<!-- START_HIGHLIGHT --> 
    <%= f.text_field :name, size: 40 %> 
<!-- END_HIGHLIGHT --> 
    </div> 
    <div class="field"> 
    <%= f.label :address %><br> 
<!-- START_HIGHLIGHT --> 
    <%= f.text_area :address, rows: 3, cols: 40 %> 
<!-- END_HIGHLIGHT --> 
    </div> 
    <div class="field"> 
    <%= f.label :email %><br> 
<!-- START_HIGHLIGHT --> 
    <%= f.email_field :email, size: 40 %> 
<!-- END_HIGHLIGHT --> 
    </div> 
    <div class="field"> 
    <%= f.label :pay_type %><br> 
<!-- START_HIGHLIGHT --> 
    <%= f.select :pay_type, Order::PAYMENT_TYPES, 
        prompt: 'Select a payment method' %> 
<!-- END_HIGHLIGHT --> 
    </div> 
    <div class="actions"> 
<!-- START_HIGHLIGHT --> 
    <%= f.submit 'Place Order' %> 
<!-- END_HIGHLIGHT --> 
    </div> 
<% end %> 

/app/models/order.rb:

class Order < ActiveRecord::Base 
    PAYMENT_TYPES = [ "Check", "Credit card", "Purchase order" ] 
    has_many :line_items, dependent: :destroy 
    # ... 
    validates :name, :address, :email, presence: true 
    validates :pay_type, inclusion: PAYMENT_TYPES 
end 

/app/models/line_item.rb:

class LineItem < ActiveRecord::Base 
    belongs_to :order 
    belongs_to :product 
    belongs_to :cart 
    def total_price 
    product.price * quantity 
    end 
end 

回答

0

好吧,它解決了,問題是在應用程序/模型/ order.rb 我什麼時候更新訂單不工作 Order類<的ActiveRecord :: Base的 的has_many:line_items依賴:摧毀 PAYMENT_TYPES = 「檢查」, 「信用卡」, 「採購訂單」]

驗證:姓名,:地址:電子郵件,存在:真 驗證:pay_type,包括:PAYMENT_TYPES DEF add_line_items_from_cart(cart) cart.line_items.each do | item | item.cart_id =零 line_items < <項目 結束 結束 結束

與attr_accessible變更後:cart_id,:PRODUCT_ID,:產品:名稱,:地址:電子郵件:pay_type

類訂單< ActiveRecord :: Base attr_accessible:cart_id,:product_id,:product,:name,:address,:email,:pay_type has_many:line_items,dependent :: destroy PAYMENT_TYPES = [「Check」,「Credit card」, 「採購訂單」]

驗證:姓名,:地址:電子郵件,存在:真 驗證:pay_type,包括:PAYMENT_TYPES 高清add_line_items_from_cart(車) cart.line_items.each做|項目| item.cart_id =零 line_items < <項目 結束 結束 結束

現在,一切工作已預期。

感謝

問候