#ruby-on-rails #forms
#ruby-on-rails #формы
Вопрос:
У меня есть модель собрания, которая может быть инициирована несколькими способами. Пользователь может перейти на страницу и инициализировать собрание в качестве Преподавателя. Он также может инициировать собрание с другой страницы в качестве студента. Я хотел бы иметь общую форму для события. Если он инициирован как Tutor, то определенные поля будут заполнены автоматически, поэтому нет необходимости показывать эти поля в форме. Аналогичная ситуация для собрания, инициированного Студентом.
Как я могу изменить форму в зависимости от страницы, с которой приходит пользователь? Я бы предпочел не использовать Javascript, если это возможно.
Спасибо.
Ответ №1:
Моей рекомендацией будут вложенные маршруты. На самом деле вы не описываете взаимосвязь между вашими моделями, но идея заключалась бы в том, чтобы иметь 2 разных URL-адреса, например:
example.com/students/3/meetings/new
example.com/tutors/7/meetings/new
Ваш meetings_controller может проверять наличие params[:student_id]
или params[:tutor_id]
определять, какую форму он будет отображать.
Если пользователь фактически вошел в систему как студент или преподаватель, то вам, вероятно, следует использовать эту информацию (возможно, из файла cookie) вместо этого.
Комментарии:
1. Спасибо за ваш ответ. Мне кажется, что это более систематическое решение, но я не совсем уверен в преимуществе решения Джонатана. Не могли бы вы рассказать мне об этом?
2. В зависимости от вашего приложения и взаимосвязей моделей это может быть более элегантным решением. Все зависит.
3. Ну, для вашего конкретного случая единственное преимущество — это немного более красивый URL-адрес —
/students/3/meetings/new
vs/meetings/new?type=student
или что-то в этом роде. Что подтолкнуло бы меня к вложенным маршрутам, так это то, что в будущем вы можете поддерживать URL/students/3/meetings
-адрес, например, для перечисления всех собраний для данного учащегося. В противном случае они в значительной степени эквивалентны.4. Спасибо вам обоим, Эллиот и Джонатан. Ваши ответы очень полезны.
Ответ №2:
Вы можете передавать данные для предварительного заполнения в строке запроса. Или в events_controller вы можете проверить HTTP_REFERRER и установить необходимые атрибуты.
Передача данных в строке запроса, вероятно, лучший выбор, но все зависит от деталей вашего приложения.
Пример:
<%= link_to edit_event_path(@event, :name => 'Override Name', :day => 'Monday') %>
# will generate /events/123/edit?name=Override Nameamp;day=Monday
Комментарии:
1. Привет, Джонатан, не могли бы вы, пожалуйста, привести мне пример передачи данных в строке запроса? Большое спасибо за вашу помощь.