根据select(Rails)分别获取并显示数据库行中的所有值

嗨,我被困在制作发票申请表。 我想有一个选项,您可以从customers表中添加现有客户,并将这些值添加到发票中。

我想要显示的值是company_namevat_numberiban_number

我试过这样做:

  

但显然这只能得到company_name的值。

我尝试使用collection.select但是它也只获得数据库行的一个值而不是全部3个值。


我希望能够从仅包含company_name的列表或表行中进行选择,但是当我单击该company_name时,它还必须显示vat_numberiban_number (单独地,在页面的不同部分)。

我的发票/ _form中的这样的东西是最佳的:

 

这是我的发票控制器:

 class InvoicesController < ApplicationController before_action :set_invoice, only: [:show, :edit, :update, :destroy] before_action :authenticate_user! # GET /invoices # GET /invoices.json def index @invoices = current_user.invoices.all flash.now[:notice] = "U haven't added any invoices yet" if @invoices.empty? end # GET /invoices/1 # GET /invoices/1.json def show end # GET /invoices/new def new @invoice = current_user.invoices.new @invoice.build_company @invoice.products.build @invoice.build_customer end # GET /invoices/1/edit def edit end # POST /invoices # POST /invoices.json def create @invoice = current_user.invoices.new(invoice_params) respond_to do |format| if @invoice.save format.html { redirect_to @invoice, notice: 'Your invoice is saved.' } format.json { render :show, status: :created, location: @invoice } else format.html { @invoice.build_company @invoice.products.build @invoice.build_customer render :new } format.json { render json: @invoice.errors, status: :unprocessable_entity } end end end # PATCH/PUT /invoices/1 # PATCH/PUT /invoices/1.json def update respond_to do |format| if @invoice.update(invoice_params) format.html { redirect_to @invoice, notice: 'Your invoice is edited.' } format.json { render :show, status: :ok, location: @invoice } else format.html { render :edit } format.json { render json: @invoice.errors, status: :unprocessable_entity } end end end # DELETE /invoices/1 # DELETE /invoices/1.json def destroy @invoice.destroy respond_to do |format| format.html { redirect_to invoices_url, notice: 'Your invoice is deleted.' } format.json { head :no_content } end end private # Use callbacks to share common setup or constraints between actions. def set_invoice @invoice = current_user.invoices.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def invoice_params params.require(:invoice).permit(:number, :currency, :date, :duedate, :btwtotal, :subtotal, :total, :footer, customer_attributes: [:id, :company_name, :address_line_1, :iban_number, :vat_number, :zip_code, :_destroy], company_attributes: [:id, :iban_number, :company_name, :_destroy], products_attributes: [:id, :quantity, :description, :unitprice, :btw, :total]) end end 

选择下拉列表位于新操作内,所选数据应在新操作,索引操作和显示操作中可见,并在编辑操作中可编辑。


我阅读了整个ruby文档,他们对这个特定的实例非常模糊。

注意: 我不想只是一个答案,我希望能够理解如何在未来的项目中使用不同的标准。 我希望其他人也能理解基本概念。

任何关于如何实现这个或在哪里寻找答案的想法都将非常感激

 <%= select_tag 'choose customer', options_from_collection_for_select(current_user.customers.all, 'id', 'company_name'), id: "choose_customer" %> 

您可以将更改事件从rails绑定到ajax调用,发送所选对象的id ,如果要根据所选值获取数据,则call a method ,然后使用该响应处理视图

  $(document).ready(function() { $("#choose_company").bind("change",function() { if ($(this).val() != undefined) { $.ajax({ url : "/my_action", data: {'company': $(this).val()}, dataType: "json", type: "GET", success : function(data) { $(".display_btw").html(data["btw_number"]); $(".display_iban").html(data["iban_number"]); $('.chosen_company_btw').val(data["btw_number"]).text(data["btw_number"]); $('.chosen_company_iban').val(data["iban_number"]).text(data["iban_number"]); } }) } }) }) 

你的控制器动作可能是这样的,

get '/my_action', to: 'invoices#my_action'添加此路线。

 def my_action if params[:company].present? @company = current_user.companies.find(params[:company]) @data = Hash.new @data["btw_number"] = @company.btw_number @data["iban_number"] = @company.iban_number render json: @data and return false end end 

此操作返回vat_numberiban_number ,它应根据所选值显示在视图中。

customers模型上创建一个方法,以友好,人类可读的方式将这些信息连接在一起:

 def friendly_info "#{company_name} (#{vat_number}) - IBAN #{iban_number}" end 

然后在select语句中使用该方法代替company_name