мутировать форму Rails в зависимости от того, с какой страницы приходит пользователь

#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. Привет, Джонатан, не могли бы вы, пожалуйста, привести мне пример передачи данных в строке запроса? Большое спасибо за вашу помощь.