#ruby-on-rails #button
#ruby-on-rails #кнопка
Вопрос:
У меня есть форма, и в этой форме есть submit_tag и тег поля файла. Пока пользователь не выберет файл, кнопка отправки должна быть отключена. Когда file_field_tag заполнен, кнопка должна быть включена. Каков наилучший способ сделать это?
Это мой код:
<% form_tag({:action => 'match'}, {:multipart => true, :id => 'file_form_id'}) do %>
<%= file_field_tag 'file', :size => 500%></p>
<%= submit_tag 'Submit' -%>
<% end -%>
Заранее спасибо!
Ответ №1:
Я бы использовал jQuery (или обычный js), чтобы привязать обработчик события «изменить» к file_field_tag. Используйте функцию jQuery .val() для file_field_tag, чтобы проверить, присутствует ли файл. Пример кода ниже:
<%= form_tag(import_substitutions_path, :method => :post, multipart: true) do %>
<%= file_field_tag 'file-field' %>
<%= submit_tag "Import CSV", disabled: true, id: 'csv-import-submit' %>
<% end %>
<script>
var csvField = $('#file-field');
var submitButton = $('#csv-import-submit');
$(csvField).change(function() {
var fileValue = $(csvField).val();
if ( fileValue.empty() ) {
$(submitButton).attr("disabled", true);
} else {
$(submitButton).attr("disabled", false);
}
})
</script>
Я мог бы также предложить альтернативное решение простого добавления required: true
опции в file_field_tag:
<%= file_field_tag 'file-field', required: true %>
Ответ №2:
Вам нужно будет сделать это на стороне клиента с помощью javascript. Отключите кнопку изначально, затем создайте метод на стороне клиента, который запускается при изменении поля ввода. Метод проверит, есть ли значение, и включит кнопку. Я бы использовал ненавязчивый js через jQuery.
Комментарии:
1. И как бы это выглядело? Теперь у меня есть: <%= submit_tag ‘Submit’, :disabled => true -%>, но как включить его обратно? Я не могу найти реальных примеров в Интернете…
2. Перейдите к jquery.com. Вам нужно изучить JavaScript на стороне клиента, чтобы заставить это работать. jQuery — самый простой способ сделать это. Вы не собираетесь использовать это в своем Ruby-коде.
Ответ №3:
Я знаю, что это не ответ на ваш вопрос, но вот как я решил ту же проблему. Я проверяю наличие файла в методе контроллера, который его использует:
def import
if params[:file].nil?
redirect_to some_model_url, alert: "CSV document not present."
else
ModelName.import(params[:file])
redirect_to some_model_url, notice: "Model Name collection imported."
end
end