我是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”字段。
感谢您的帮助。
答案 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
的值。