如何在 Rails 4.0 表单中显示选定记录中的关联值

Posted

技术标签:

【中文标题】如何在 Rails 4.0 表单中显示选定记录中的关联值【英文标题】:How to show an associated value from a selected record in Rails 4.0 form 【发布时间】:2016-10-26 11:52:48 【问题描述】:

我对 RoR 还很陌生,目前正在为业余体育俱乐部经理开发一款免费的小应用程序,帮助他们跟踪付款。此应用程序显示相关的玩家数据和收取费用 (tarifa) 付款的表格。我想显示在输入付款之前支付的概念费用。这是带有表单和生成的 html 的应用程序视图:form for pagos

这是 pagos_controller.rb 'new' 操作:

def new
  @pago = Pago.new
  @conceptos = Concepto.all
  @jugador = Jugador.find_by(id: params[:jugador_id])
end

这是渲染到views/pagos/new.html.erb中的views/pagos/_form.html.erb:

<%= form_for(@pago) do |f| %>
 <% if @pago.errors.any? %>
  <p> All the error showing logic is omitted here for simplicity </p>
 <div class="field-tm">
   <%= f.label :concepto %>
   <%= f.collection_select :concepto, @conceptos, :name, :name %>
 </div>
 <div class="field-tm">
   <%= f.label :tarifa %> <div id="la-tarifa"> </div>
 </div>
 <div class="field-tm">
   <%= f.text_field :cantidad, :placeholder => "Cantidad a pagar" %>
 </div>
 <%= f.hidden_field :jugador_id, :value => params[:jugador_id] %>
 <div class="actions">
  <%= f.submit "Registrar Pago", class: "btn btn-default"%>
 </div>
<% end %>

这是 pagos 架构...

create_table "pagos", force: :cascade do |t|
  t.string   "concepto"
  t.decimal  "cantidad"
  t.integer  "jugador_id"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

还有 Conceptos 架构:

create_table "conceptos", force: :cascade do |t|
  t.string   "name"
  t.decimal  "tarifa"
  t.datetime "created_at", null: false
  t.datetime "updated_at", null: false
end

我需要获取在“collection_select”中选择的值,以使用它来查找该概念的 tarifa,就像在

中一样
@conceptos.find_by(name: theConceptoName).tarifa

并将其放入

$("#la-tarifa").text(tarifa)

显示值,但不知道如何从

中获取“theConceptoName”变量
<%= f.collection_select :concepto, @conceptos, :name, :name %>

我尝试了几种方法,我想出了 jQuery 方法来获取值,所以它会是这样的:

$("#pago_concepto").change( function()
  var miConcepto = $("#pago_concepto").value();
  do the @conceptos search for miConcepto and get the tarifa;(*)
  $("#la-tarifa").text(tarifa);
);

但是我如何在 pagos.cofee 代码中执行查询 (*) 以从 @conceptos 获取 tarifa 值...我已经做了很多谷歌研究,但我发现的每个答案都让我更加困惑。 请帮帮我。

【问题讨论】:

【参考方案1】:

试试这个,只是一个简单的 ajax 查找:

JS:

$("#pago_concepto").change( function()
  var miConcepto = $("#pago_concepto").value();
  $.getJSON('/tarifa/' + miConcepto, function(data) 
    $("#la-tarifa").text(data.tarifa);
  );
);

pagos_controller:

def tarifa
  tarifa = Concepto.find_by(name: params[:concept_name]).tarifa
  respond_to do |format|
    format.json  render json: tarifa: tarifa 
  end
end

routes.rb:

get '/tarifa/:concept_name', to: 'pagos#tarifa'

如果你愿意的话,把js转成coffeescript应该比较容易。

【讨论】:

嗨,我仍然无法获得 'tarifa' 值,我可能做错了什么。如果我在浏览器中检查 jQuery,我可以得到 $("#pago_concepto).val() 的有效响应,但 $("#la-tarifa").val 仍然是“”。还有其他想法吗? 应该是$("#pago_concepto).val()。你是说当你从下选择一个项目时你没有得到价值? 是的,我确实发现了 .val() 的不同之处,所以我第一次更正了它。我禁用了 Turbolinks,现在它工作正常,但我不知道这是否会影响系统的任何部分,目前它工作正常。我想要你的cmets,顺便说一句,谢谢你的帮助,很有启发性。 Started GET "/tarifa/Temporada" for 127.0.0.1 at 2016-06-28 12:36:32 -0500&lt;br&gt; Processing by PagosController#tarifa as JSON&lt;br&gt; Parameters: "concept_name"=&gt;"Temporada"&lt;br&gt; Temporada&lt;br&gt; Concepto Load (0.2ms) SELECT "conceptos".* FROM "conceptos" WHERE "conceptos"."name" = ? LIMIT 1 [["name", "Temporada"]]&lt;br&gt; Completed 200 OK in 2ms (Views: 0.3ms | ActiveRecord: 0.2ms) 我认为 turbolink 可能会弄乱现有的 jquery 事件,但我不确定,因为我不经常使用 turbolink。尝试按照 SO 推荐的方式安装 jquery-turbolinks gem (***.com/questions/17386740/…),看看它是否与 turbolinks 配合得很好。如果我的解决方案对您有帮助,将不胜感激:)

以上是关于如何在 Rails 4.0 表单中显示选定记录中的关联值的主要内容,如果未能解决你的问题,请参考以下文章

已解决:如何在 Django 中的表单错误中重新显示带有选定值的表单集和 Select2 字段

Django:如何根据表单中的选定选项在模板上显示来自 django 数据库的图像?

Rails 6将输入添加到页面中的列表

Rails 表单(选择/选项) - 如何用 HAML 标记选定的选项?

仅当用户选择rails表单中的特定选项时,如何显示字段

如何在 Rails 中执行 AJAX-y 条件显示/隐藏表单字段?