Рельсы button_to для непосредственного запуска действия в модели

#ruby-on-rails #model-view-controller #design-patterns

#ruby-on-rails #model-view-controller #шаблоны проектирования

Вопрос:

Я хотел бы разрешить пользователю отменить свое событие, нажав кнопку на странице показа. У меня есть метод cancel в модели событий, но я не хочу создавать метод cancel в контроллере, если мне это не нужно.

Мои вопросы:

  1. В этом случае рекомендуется вызывать метод в модели непосредственно из представления?
  2. Если все в порядке, то как мне это сделать с помощью button_to?

Спасибо.

Ответ №1:

Нет, попытка вызвать метод модели напрямую не является хорошей идеей. Система маршрутизации Rails маршрутизирует к контроллерам, поэтому она просто не будет работать (если вы не хотите выполнить намного больше работы, чем просто написать крошечный контроллер).

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

Комментарии:

1. Спасибо вам обоим, му и Срджан. Жаль, что я могу принять только один ответ.

2. @AdamNYC: Вы можете проголосовать и переключить ответ на Srdjan, хотя, я думаю, он появился на несколько секунд раньше меня.

3. Спасибо за совет. Я только что сделал.

4. Нет, это круто. Пока ответ помог, я счастлив. Не нужно преследовать карму.

Ответ №2:

  1. Нет, это не очень хорошая идея.
  2. Не имеет значения, поскольку это не очень хорошая идея.

Вы можете подключить button_to к действию обновления в EventsController, если модель событий имеет состояния, или к действию уничтожения, если отмена события означает его удаление.