Хобрук: Ваш путь к мастерству в программировании

Типы полей ввода условной формы

Рельсы 2.3.11

Я хотел бы использовать text_field для ввода данных при одном условии, иначе используя поле выбора. Прямо сейчас мой код выглядит так:

представления/постеры/new.html.erb

<% form_for @poster, :html => {:multipart => true} do |f| %>
  <%= f.error_messages %>
  <p>
    <%= f.label :image %> - We're not going to enlarge it for you, so please upload the biggest copy you can!<br />
    <%= f.file_field :image %><br />
  </p>


    <p>
    <% if current_user.admin? && params[:event_id] && !current_user.events.find_by_id(params[:event_id]) && Event.find_by_id(params[:event_id]) %>
      <%= f.label "Event ID" %><br />
      <%= f.text_field :event_id, :value => params[:event_id] %>
    <% else  %>
      <%= f.label :event_id %><br />
      <%= f.select :event_id, @events, :selected => params[:event_id].to_i %>
    <% end %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

controllers/posters_controller.rb

def new
    @poster = Poster.new

    current_user ||= User.find_by_id session[:user_id]
    @events = [["Don't attach to an event", '']]
    current_user.events.each {|event| @events << [event.title, event.id]}

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @poster }
    end
end

Сообщение об ошибке: http://cl1p.net/halp.

Как я могу использовать два разных типа полей ввода формы для одного и того же параметра (но каждый при разных условиях, а не одновременно)?

Обновление: я думаю, что проблема связана с тем, что Rails помещает ранее отправленную информацию обратно в соответствующие поля ввода. Это объясняет, почему не возникает истерики, когда файл, который проходит все проверки (то есть PNG размером менее 3 МБ), но ломается, когда ничего (или что-то, что не соответствует этому условию) не прикрепляется.

25.06.2011

Ответы:


1

Во-первых, я не понимаю, почему вы вручную устанавливаете значения в текстовом поле и поле выбора. Обычно Rails делает это за вас, но без определения формы я не могу сказать, действительно ли вам это нужно.

Даже тогда, учитывая информацию, я думаю, можно с уверенностью сказать, что вам нужно следующее:

f.text_field :event_id
...
f.select :event_id, @events

Это должно работать для того, что вы собираетесь делать. Я не уверен, какое это имеет отношение к отправке файла, но да, вы правы насчет ранее отправленной части. Неожиданный ноль проистекает из этого:

params[:event_id].to_i

Если вы не устанавливаете этот параметр вручную внутри своего контроллера, вы не сможете преобразовать его в целое число, если оно равно нулю. Если вы пойдете с использованием базовых вызовов помощника формы, это исчезнет.

26.06.2011
  • Когда я изучил это глубже, это не имело прямого отношения к прикреплению файла - это было только решающим фактором для того, было ли создание нового постера успешным... или возврат на новую страницу для исправления, вызывающий Ошибка. Будет ли этот новый f.select также автоматически выбирать событие, идентификатор которого был передан в качестве аргумента URL? 26.06.2011
  • Это не сработало. Разделив код Rails на несколько строк, я определил, что неожиданный nil связан с :event_id рядом с f.select. 26.06.2011
  • Вы не упомянули, что event_id был передан в качестве аргумента URL, но да, f.select действительно автоматически выбирает идентификатор события в таком случае. 26.06.2011
  • Если вы опубликуете свой вызов form_for и код действия вашего контроллера и, возможно, фактическое исключение, вам будет легче помочь. 26.06.2011
  • Ошибка появляется в «новом» представлении при отображении действием «создать». Вы также создали переменную экземпляра @events в действии создания? В противном случае опубликуйте свой код действия создания. 26.06.2011
  • Ты был прав. Как только я поместил определение @event в режим создания и обновления (в дополнение к новому и редактированию), все заработало гладко; спасибо! 27.06.2011
  • Новые материалы

    Учебные заметки JavaScript Object Oriented Labs
    Вот моя седьмая неделя обучения программированию. После ruby ​​и его фреймворка rails я начал изучать самый популярный язык интерфейса — javascript. В отличие от ruby, javascript — это более..

    Разбор строк запроса в vue.js
    Иногда вам нужно получить данные из строк запроса, в этой статье показано, как это сделать. В жизни каждого дизайнера/разработчика наступает момент, когда им необходимо беспрепятственно..

    Предсказание моей следующей любимой книги 📚 Благодаря данным Goodreads и машинному обучению 👨‍💻
    «Если вы не любите читать, значит, вы не нашли нужную книгу». - J.K. Роулинг Эта статья сильно отличается от тех, к которым вы, возможно, привыкли . Мне очень понравилось поработать над..

    Основы принципов S.O.L.I.D, Javascript, Git и NoSQL
    каковы принципы S.O.L.I.D? Принципы SOLID призваны помочь разработчикам создавать надежные, удобные в сопровождении приложения. мы видим пять ключевых принципов. Принципы SOLID были разработаны..

    Как настроить Selenium в проекте Angular
    Угловой | Селен Как настроить Selenium в проекте Angular Держите свое приложение Angular и тесты Selenium в одной рабочей области и запускайте их с помощью Mocha. В этой статье мы..

    Аргументы прогрессивного улучшения почти всегда упускают суть
    В наши дни в кругах веб-разработчиков много болтают о Progressive Enhancement — PE, но на самом деле почти все аргументы с обеих сторон упускают самую фундаментальную причину, по которой PE..

    Введение в Джанго Фреймворк
    Схема «работать умно, а не усердно» В этой и последующих статьях я познакомлю вас с тем, что такое фреймворк Django и как создать свое первое приложение с помощью простых и понятных шагов, а..