Подтвердить что ты не робот

Rails: вызов другого действия контроллера с контроллера

Мне нужно вызвать действие create в контроллере A, из контроллера B.

Причина в том, что мне нужно перенаправить по-разному, когда я звоню из контроллера B.

Можно ли это сделать в Rails?

4b9b3361

Ответ 1

Вы можете использовать перенаправление к этому действию:

redirect_to your_controller_action_url

Подробнее: Rails Guide

Чтобы просто выполнить новое действие:

redirect_to your_controller_action_url and return

Ответ 2

Представленная вами логика не является MVC, а не Rails, совместимой.

  • Контроллер отображает представление или перенаправление

  • Метод выполняет код

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

Пример:

 def index
   get_variable
 end

 private

 def get_variable
   @var = Var.all
 end

Тем не менее, вы можете сделать то же самое через разные контроллеры и вызвать метод от контроллера A, пока вы находитесь в контроллере B.

Словарь чрезвычайно важен, поэтому я настаиваю много.

Ответ 3

Чтобы использовать один контроллер из другого, сделайте следующее:

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

Ответ 4

Вы можете использовать url_for для получения URL-адреса контроллера и действия, а затем использовать redirect_to для перехода к этому URL-адресу.

redirect_to url_for(:controller => :controller_name, :action => :action_name)

Ответ 5

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

Вы должны

  • дублируйте это действие в контроллере B или
  • оберните его как модельный метод, который будет использоваться для всех контроллеров, или
  • вы можете расширить это действие в контроллере A.

Мое мнение:

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

    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, который может быть любым желаемым путем.

Ответ 6

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

Ответ 7

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

Надеюсь, что это поможет.

Ответ 8

Вы можете вызвать другое действие внутри действия следующим образом:

redirect_to action: 'action_name'

class MyController < ApplicationController
  def action1
   redirect_to action: 'action2'
  end

  def action2
  end
end

Ответ 9

Отделите эти функции от контроллеров и поместите их в файл модели. Затем включите файл модели в ваш контроллер.