如何自动填充从 rails 4 关联中获取特定列的输入值?

How can I autofill an input value getting a specific column from a rails 4 association?

我是 rails 4 的新手,我想知道是否可以使用其他 table.

的现有列来填充我表单中的字段值

我正在考虑使用 JQuery 来自动执行此操作,但不知何故我无法弄清楚。

我的模型有这样的关系:

ordem_de_servico.rb

belongs_to :cliente belongs_to :mecanico belongs_to :servico

cliente.rb

has_many :ordem_de_servicos, dependent: :destroy has_many :mecanicos, through: :ordem_de_servicos has_many :servicos, through: :ordem_de_servicos

mecanico.rb

has_many :ordem_de_servicos, dependent: :destroy has_many :clientes, through: :ordem_de_servicos has_many :servicos, through: :ordem_de_servicos

servico.rb

has_many :ordem_de_servicos, dependent: :destroy has_many :clientes, through: :ordem_de_servicos has_many :mecanicos, through: :ordem_de_servicos

我的 Ordem_de_serviço _form.html.erb 是:

<div class="form-group">
    <%= f.label :cliente, :class => "control-label col-xs-2 required" %>
   <div class="col-xs-10">
    <%= f.select :cliente_id, options_for_select(Cliente.all.map{ |s| [s.nome, s.id] }), :class => "form-control" %>
   </div>
     <%= error_span(@ordem_de_servico[:cliente]) %>
  </div>
  <div class="form-group">
    <%= f.label :serviço, :class => "control-label col-xs-2 required" %>
   <div class="col-xs-10">
    <%= f.select :servico_id, options_for_select(Servico.all.map{ |s| [s.nome, s.id] }) %>
   </div>
    <%= error_span(@ordem_de_servico[:servico_id]) %>
  </div>
  <div class="form-group">
    <%= f.label :mecânico, :class => "control-label col-xs-2 required" %>
   <div class="col-xs-10">
    <%= f.select :mecanico_id, options_for_select(Mecanico.all.map{ |s| [s.nome, s.id] }) %>
   </div>
    <%= error_span(@ordem_de_servico[:mecanico_id]) %>
  </div>
  <div class="form-group">
    <label class="control-label col-xs-2 required">Valor M. Obra</label>
   <div class="col-xs-10">
    <%= f.text_field :valor_obra, :class => "form-control", :style => "width: auto;" %>
   </div>
    <%= error_span(@ordem_de_servico[:valor_obra]) %>
  </div>

当你select字段servico_id.

感谢您的帮助。

有多种方法可以完成此操作,我认为最简单的方法是在呈现视图之前在控制器中设置该字段的值,如下所示:

def new
    # ... other code
    @ordem_de_servico.valor_obra = some_value
end

其中 some_value 是您要设置的另一个 table 的值。

这样做的原因与当您 "edit" 对象时填充字段的原因相同;您的 f.text_field 字段会根据您指定的名称填充表单。因此,如果您在模型对象的一个​​字段上设置一个值,它将在呈现表单时 "automatically" 填充。

注意:我假设您的对象名称,但如果名称不正确,我相信您能理解

这完全未经测试。

options_for_select 允许您指定可选的第三个值,它是 html 属性的散列。因此,您可以将您的服务代码更改为:

<%= f.select :servico_id, options_for_select(Servico.all.map{ |s| [s.nome, s.id, {data: {valor: s.valor}}] }), id: 'servicio-select' %>

应该 在每个 <option> 标签上给你一个 data-valor 属性。请注意,我还为 <select> 标记指定了一个 ID servicio-select,因此我们可以使用 jquery 定位它。让我们也给 valor_obra 输入一个 id,这样我们也可以定位它:

<%= f.text_field :valor_obra, :class => "form-control", :style => "width: auto;", :id => 'valor-obra-input' %>

现在我们可以加入一些 jquery 魔法来为我们完成剩下的工作:

$('#servicio-select').change(function() {
  $('#valor-obra-input').val($('#servicio-select:selected').data('valor'));
}):

这应该使用 #servicio-select 的所选选项的属性 data-valor 的值更新 #valor-obra-input 的值。