Мне нужно вызвать действие 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
		Отделите эти функции от контроллеров и поместите их в файл модели. Затем включите файл модели в ваш контроллер.