如何自动填充从 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
的值。
我是 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
的值。