Мне нужно вызвать действие create в контроллере A из контроллера B.
Причина в том, что мне нужно перенаправить иначе, когда я звоню с контроллера B.
Можно ли это сделать в Rails?
ruby-on-rails
ddayan
источник
источник
Ответы:
Вы можете использовать перенаправление на это действие:
Подробнее: Руководство по Rails
Чтобы просто отобразить новое действие:
источник
render
вместоredirect_to
. Что скажешь, @Spyros?redirect_to
не позволяет использовать,post: :method
и это может быть полезно, в частности, для перенаправления на уже существующееcreate
действие другого контроллера, как @ddayan спросил в первый раз. У меня похожая ситуация, когда в какой-то ситуации я должен создать другой объект. Вызов другогоcreate
действия может быть DRYer ..Чтобы использовать один контроллер от другого, сделайте следующее:
источник
controller_you_want
вы бы это сделалиcontroller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)
похоже, работает, чтобы вернуть JSON от другого контроллераcontroller_you_want.request
но не смогли получить этот запуск с передачей хэша или экземпляра параметров.params
становятся доступнымиcontroller_you_want
, установивrequest
в 3-й строке. Вы об этом спрашиваете?render html: controller_you_want.process(:action_you_want)
Представленная вами логика не совместима с MVC и не с Rails.
Контроллер отображает представление или перенаправление
Метод выполняет код
Исходя из этих соображений, я советую вам создавать методы в вашем контроллере и вызывать их из вашего действия.
Пример:
Тем не менее, вы можете делать то же самое через разные контроллеры и вызывать метод из контроллера A, пока вы находитесь в контроллере B.
Словарь очень важен, поэтому я очень настаиваю.
источник
get_variable
теперь можно вызвать с другого контроллера?Вы можете использовать
url_for
для получения URL-адреса контроллера и действия, а затем использоватьredirect_to
для перехода по этому URL-адресу.источник
redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)
будет результат/contorller_name/action_name?param1=val1¶m2=val2
. См. ДокументациюЭто плохая практика - вызывать другое действие контроллера.
Вам следует
Мое мнение:
Третий подход - это то, что я делал часто. Я покажу небольшой пример.
Таким образом, вы можете отправить в этот параметр действия
redirect_to
, который может быть любым путем.источник
/models
или обычный класс или модуль в/lib
). Единственная проблема заключается в том, что ваш контроллер взаимодействует с представлением через переменные экземпляра - вам придется исправить это дублирование другим способом.Может быть, логику можно было бы извлечь в помощника? помощники доступны всем классам и не передают управление. Вы можете проверить в нем, возможно, имя контроллера, чтобы узнать, как он был вызван.
источник
Композиция на помощь!
Учитывая причину, вместо того, чтобы вызывать действия между контроллерами, следует разрабатывать контроллеры для разделения общих и настраиваемых частей кода. Это поможет избежать как дублирования кода, так и нарушения паттерна MVC.
Хотя это можно сделать разными способами, использование проблем ( композиции ) является хорошей практикой.
Надеюсь, это поможет.
источник
Вы можете вызвать другое действие внутри действия следующим образом:
redirect_to действие: 'action_name'
источник
Отделите эти функции от контроллеров и поместите их в файл модели. Затем включите файл модели в свой контроллер.
источник