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

时间:2015-01-08 22:37:36

标签: ruby-on-rails activerecord

我是rails 4的新手,我想知道是否可以使用其他表中的现有列填充表单中的字段值。

我正在考虑使用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>

当我选择字段servico_id时,我想用Servicos表中的“valor”列自动填充“valor_obra”字段。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

有很多方法可以实现这一点,我认为最简单的方法是在渲染视图之前在控制器中设置该字段的值,如下所示:

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

其中some_value是您要设置的其他表格中的值。

这样做的原因与“编辑”对象时填充字段的原因相同;您的f.text_field字段会根据您指定的名称填充表单。因此,如果在模型对象的字段上设置值,则在呈现表单时将“自动”填充该值。

注意:我对你的对象的名字做了一个假设,但我确信你知道这个名字是不正确的

答案 1 :(得分:0)

这是完全未经测试的。

options_for_select允许您指定可选的第三个值,该值是html属性的哈希值。因此,您可以将servicio代码更改为:

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

应该在每个data-valor标记上提供<option>属性。请注意,我还为<select>标记提供了servicio-select的ID,因此我们可以使用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'));
}):

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