簡體   English   中英

Ruby on Rails - 根據下拉選擇填充數據庫記錄

[英]Ruby on Rails - Populate database record based on drop down selection

我對Rails相對較新,並創建了我的第一個應用程序,它是一個引用工具。

我目前正在使用3個表 - 產品,訂單和Order_lines。 產品保持我們產品的當前價格 - 包括成本。 訂單持有訂單的外殼,最終將其綁定到客戶表。 Order_lines包含所有order_lines - 並且視圖是根據Order_lines和Orders之間的關系和匹配索引填充的。

目前,該視圖還使用Products和Order_Lines之間的連接來填充價格。 但是,這不允許我存儲歷史數據(如果我在產品表中更改價格,那么之前創建的所有order_lines都會以新價格更新) - 所以我想要一個人從中選擇產品下拉菜單 - 以及系統提取該產品的當前價格/成本 - 並將其添加到訂單行。

產品表包含4列labed:prod_nrc_cost,prod_nrc_price,prod_mrc_cost,prod_mrc_price

Order_lines表現在有nrc_cost_line,nrc_price_line,mrc_cost_line,mrc_price_line。

當他們選擇產品555時 - 我希望它在產品表中查找產品555的價格 - 並在Order_lines表的相應列中填寫這4個價格,並保存它。 如果我能夠在頁面上填充它(讓人們能夠根據需要調整定價),然后將其發送到控制器以保存,那將是很好的。

這有道理嗎?

如果我要留下任何東西,請告訴我。

/orders/show.html.erb文件

<%= form_for(@order_line) do |f| %>

    <% if false %>
        <% if @order_line.errors.any? %>
            <div id="error_explanation">
                <h2><%= pluralize(@order_line.errors.count, "error") %> prohibited this order_line from being saved:</h2>
            <ul>
                <% @order_line.errors.full_messages.each do |msg| %>
                <li><%= msg %></li>
                <% end %>
            </ul>
            </div>
        <% end %>
    <% end %>


      <%= f.hidden_field :order_id, class: 'form-control' %>
        <%= f.hidden_field :order_num, :value=>@order.order_num, class: 'form-control' %>
         <%= f.hidden_field :visible, class: 'form-control', :value=>true, :checked=>true %>

      <% if @order_lines.present? %>
      <%= f.hidden_field :line_num, :value=>@order_lines.maximum("line_num")+1, class: 'form-control' %>
        <% else %>
        <%= f.hidden_field :line_num, :value=>1, class: 'form-control' %>
        <% end %>



    <div class="row">

    <div class="field col-md-2 form-group">
        <%= f.label :Product %><br>
        <%= f.collection_select(:product_id, Product.all, :id, :prod_name, {:prompt => 'Select Product'},  {:id => 'product_id'}) %>
      </div>
       <div class="field col-md-2 form-group">
        <%= f.label :quantity %><br>
        <%= f.number_field :quantity, class: 'form-control' %>
      </div>
           <div class="field col-md-2 form-group">
        <%= f.label :NRC %><br>
        <%= f.number_field :nrc_price_line, class: 'form-control' %>
      </div>
     <div class="field col-md-2 form-group">
        <%= f.label :MRC %><br>
        <%= f.number_field :mrc_price_line, class: 'form-control' %>
      </div>



       <div class="field col-md-2 form-group">
        <%= f.label :discount %><br>
        <%= f.number_field :discount, class: 'form-control' %>
      </div>
         <div class="field col-md-2 form-group">
        <%= f.label :notes %><br>
        <%= f.text_field :notes, class: 'form-control' %>
      </div>


      <div class="actions col-md-2" style="padding-top:25px;">
        <%= f.submit "Add New Line", class: 'btn btn-primary' %>
      </div>
    </div>
  </div>
<% end %>

orders_controller.rb文件

    class OrdersController < ApplicationController
  before_action :set_order, only: [:show, :edit, :update, :destroy]

def orders
  @order = Order.find(params[:id])
  @order_lines = @orders.order_lines
end


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

  # GET /orders/1
  # GET /orders/1.json
  def show
    @order = Order.find(params[:id])
    @order_lines = @order.order_lines
    @order_line = OrderLine.new(:order_id=>params[:id])
    @product_categories = @order_lines.product

  end

def update_price
  @product = Product.find(params[:product_id])
  respond_to do |format|
    format.js
  end
end


  # GET /orders/new
  def new
    @order = Order.new
  end

  # GET /orders/1/edit
  def edit
  end

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

    respond_to do |format|
      if @order.save
        format.html { redirect_to @order, notice: 'Order was successfully created.' }
        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(:emp_id, :cust_id, :order_num)
    end
end

order.rb模型

class Order < ActiveRecord::Base
    has_many :order_lines
    has_many :product_categories, through: :order_lines
    has_many :products, through: :order_lines
end

首先,使用product_id將數據屬性添加到產品選擇器

您可以獲取下拉列表的更改事件的價格信息:在某些Coffeescrript文件中:

$('.your_selector').change ->
  product_id = $(this).data('product_id')
  $.ajax(
  type: 'POST'
  url: "/product_price_finder"
  product_id: product_id
  success: ( data, status, xhr ) ->
  )

的routes.rb

post "/product_price_finder/:product_id" => "products#update_price"

products_controller.rb

def update_price
  @product = Product.find(params[product_id:])
  respond_to do |format|
    format.js
  end
end

在views / products / update_price.js中

var product = $("#product_<%= @product.id %>")
// update the price with Javascript

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM