Пример того, что вы можете сделать с помощью javascript (на основе изменения выбора):
Сначала определите маршрут в коллекции для пользовательского метода ProductModel
.Давайте назовем это find
:
resources :product_models do
get 'find', on: :collection #=>output: /product_models/find/:id
end
В ProductModelsController
заставить метод find
отвечать на формат js:
def find
@product_model = ProductModel.find(params[:id])
respond_to { |format| format.js }
end
Предполагая, что в вашем application.js
есть jQuery(или другой пользовательский js-файл, который вы хотите), создайте ajax-вызов, чтобы найти product_model:
$(document).on('turbolinks:load', function() {
$('#product_product_model_id').on('change', function(){ //<-- the id selector is returned by simple_form
$.ajax({
type: "GET",
url: "/product_models/find/?id=" + $(this).val(),
success: function(data) {
},
error: function(jqXHR) {
console.error(jqXHR.responseText);
}
})
})
})
В вашем новом представлении Product
под вашей формой визуализируйте частичное имя с именем, например, «selected_product_model»":
#new.html.erb
<% simple_form_for @product do |f| %>
#... the form
f.association :product_model
<% end %>
<div>
<%= render partial: 'selected_product_model' %>
</div>
И частично создайте HTML-селекторы, в которых будут отображаться данные:
#_selected_product_model.html.erb
<p id="pm-id"></p>
<p id="pm-name"></p>
<p id="pm-desc"></p>
Затем создайте файл find.js.erb
(в папке views> product_models)чтобы обновить частичное при выбранном изменении:
# @product_model comes from the controller find#product_models
$('#pm-id').html("ID: <%= j @product_model.id.to_s %>")
$('#pm-name').html("Name: <%= j @product_model.name %>")
$('#pm-desc').html("Description: <%= j @product_model.description %>")
Конечно, это просто базовый пример того, что вы можете сделать с ajax в рельсах, вы можете настроить способ отображения своих данных или добавить некоторые условия.для предотвращения ошибок.