Мне нужно вызвать действие create в контроллере A, из контроллера B.
Причина в том, что мне нужно перенаправить по-разному, когда я звоню из контроллера B.
Можно ли это сделать в Rails?
Мне нужно вызвать действие create в контроллере A, из контроллера B.
Причина в том, что мне нужно перенаправить по-разному, когда я звоню из контроллера B.
Можно ли это сделать в Rails?
Вы можете использовать перенаправление к этому действию:
redirect_to your_controller_action_url
Подробнее: Rails Guide
Чтобы просто выполнить новое действие:
redirect_to your_controller_action_url and return
Представленная вами логика не является MVC, а не Rails, совместимой.
Контроллер отображает представление или перенаправление
Метод выполняет код
Из этих соображений я советую вам создавать методы в вашем контроллере и вызывать их из вашего действия.
Пример:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
Тем не менее, вы можете сделать то же самое через разные контроллеры и вызвать метод от контроллера A, пока вы находитесь в контроллере B.
Словарь чрезвычайно важен, поэтому я настаиваю много.
Чтобы использовать один контроллер из другого, сделайте следующее:
def action_that_calls_one_from_another_controller
controller_you_want = ControllerYouWant.new
controller_you_want.request = request
controller_you_want.response = response
controller_you_want.action_you_want
end
Вы можете использовать url_for
для получения URL-адреса контроллера и действия, а затем использовать redirect_to
для перехода к этому URL-адресу.
redirect_to url_for(:controller => :controller_name, :action => :action_name)
Это неправильная практика для вызова другого действия контроллера.
Вы должны
Мое мнение:
Третий подход - это то, что я часто делал. Поэтому я покажу небольшой пример.
def create
@my_obj = MyModel.new(params[:my_model])
if @my_obj.save
redirect_to params[:redirect_to] || some_default_path
end
end
Итак, вы можете отправить этому действию параметр redirect_to
, который может быть любым желаемым путем.
Возможно, логика может быть извлечена в помощник? помощники доступны для всех классов и не передают управление. Вы можете проверить внутри него, возможно, имя контроллера, чтобы узнать, как он был вызван.
composition на помощь!
Учитывая причину, а не вызывать действия между контроллерами, необходимо спроектировать контроллеры для разделения общих и пользовательских частей кода. Это поможет избежать дублирования кода и разрушения шаблона MVC.
Хотя это может быть сделано несколькими способами, использование проблем (composition) является хорошей практикой.
# controllers/a_controller.rb
class AController < ApplicationController
include Createable
private def redirect_url
'one/url'
end
end
# controllers/b_controller.rb
class BController < ApplicationController
include Createable
private def redirect_url
'another/url'
end
end
# controllers/concerns/createable.rb
module Createable
def create
do_usefull_things
redirect_to redirect_url
end
end
Надеюсь, что это поможет.
Вы можете вызвать другое действие внутри действия следующим образом:
redirect_to action: 'action_name'
class MyController < ApplicationController
def action1
redirect_to action: 'action2'
end
def action2
end
end
Отделите эти функции от контроллеров и поместите их в файл модели. Затем включите файл модели в ваш контроллер.