Отключить кнопку отправки, если file_field_tag не равен нулю в Ruby on Rails

#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