2015-02-06 4 views
3

Я относительно новичок в Rails и создаю свое первое приложение, которое является инструментом цитирования.Ruby on Rails - запись базы данных на основе выпадающего списка

У меня есть 3 стола, с которыми я работаю в настоящее время - Продукты, Заказы и Заказы. Продукты содержат текущую цену нашей продукции, включая затраты. Заказы держат оболочку заказа, которая в конечном итоге привяжет ее к таблице клиентов. В Order_lines хранятся все строки order_lines - и представление заполняется на основе отношения и индекса соответствия между Order_lines и Orders.

В настоящее время представление также включает цены, используя соединение между Продуктами и 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 в таблице продуктов - и заполнил эти 4 цены в соответствующих столбцах в таблице Order_lines и сохранил их. Было бы неплохо, если бы я смог заполнить его прямо на странице (давая человеку возможность корректировать цены, если они захотят), а затем отправить его на контроллер для сохранения.

Имеет ли это смысл?

Если я ничего не выкину, сообщите мне.

/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 

ответ

1

Во-первых, добавить атрибут данных к селектору продукта с 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 

в просмотров/продукции/update_price.js

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

лол - этот ответ заставил меня понять, как мало я знаю о Rails - хорошо - позвольте мне попытаться имитировать то, что у вас есть здесь- и посмотреть, что я могу придумать. Спасибо, что предоставили направление, я дам вам знать! –

+0

Нет проблем. Это должно сделать вам большую часть пути, но вам нужно будет проявить творческий подход с помощью update_price.js. Возможно, я смогу помочь вам, если вы опубликуете представление, где отображаются продукты. –

+0

вся работа выполняется над представлением /orders/show.html.erb. Я действительно добавил это в исходное сообщение - старайтесь не слишком усмехаться, я уверен, что я испортил некоторые лучшие практики. –

Смежные вопросы