Programming

Rails : 컨트롤러에서 다른 컨트롤러 작업 호출

procodes 2020. 8. 7. 21:29
반응형

Rails : 컨트롤러에서 다른 컨트롤러 작업 호출


컨트롤러 B에서 컨트롤러 A의 생성 작업을 호출해야합니다.

그 이유는 컨트롤러 B에서 호출 할 때 다른 방식으로 리디렉션해야하기 때문입니다.

Rails에서 할 수 있습니까?


해당 작업에 대한 리디렉션을 사용할 수 있습니다.

redirect_to your_controller_action_url

추가 정보 : Rails 가이드

새 액션을 렌더링하려면 :

redirect_to your_controller_action_url and return

다른 컨트롤러에서 하나의 컨트롤러를 사용하려면 다음과 같이하십시오.

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

당신이 제시하는 로직은 MVC가 아니고 Rails가 아닙니다.

  • 컨트롤러가보기 또는 리디렉션을 렌더링합니다.

  • 메서드는 코드를 실행합니다.

이러한 고려 사항에서 컨트롤러에 메서드를 만들고 작업에서 호출하는 것이 좋습니다.

예:

 def index
   get_variable
 end

 private

 def get_variable
   @var = Var.all
 end

즉, 다른 컨트롤러를 통해 똑같은 작업을 수행 하고 컨트롤러 B에있는 동안 컨트롤러 A 메서드호출 할 수 있습니다.

어휘가 매우 중요하기 때문에 제가 많이 주장합니다.


을 사용 url_for하여 컨트롤러 및 작업에 대한 URL을 가져온 다음 redirect_to해당 URL로 이동하는 데 사용할 수 있습니다.

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

다른 컨트롤러 작업을 호출하는 것은 나쁜 습관입니다.

당신은

  1. 컨트롤러 B에서이 작업을 복제하거나
  2. 모든 컨트롤러에 공유되는 모델 메서드로 래핑하거나
  3. 컨트롤러 A에서이 작업을 확장 할 수 있습니다.

내 의견 :

  1. 첫 번째 접근법은 DRY가 아니지만 다른 조치를 요청하는 것보다 여전히 낫습니다.
  2. 두 번째 접근 방식은 훌륭하고 유연합니다.
  3. 세 번째 접근 방식은 제가 자주하던 방식입니다. 그래서 저는 약간의 예를 보여 드리겠습니다.

    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원하는 경로가 될 수있는 이 작업 매개 변수로 보낼 수 있습니다.


아마도 논리를 도우미로 추출 할 수 있습니까? 도우미는 모든 클래스에서 사용할 수 있으며 제어권을 전송하지 않습니다. 그 안에서 컨트롤러 이름을 확인하여 어떻게 호출되었는지 확인할 수 있습니다.


구출 작문 !

이유를 감안할 때 컨트롤러간에 작업을 호출하는 대신 코드의 공유 부분과 사용자 지정 부분을 분리하도록 컨트롤러를 설계해야합니다. 이렇게하면 코드 중복과 MVC 패턴 깨짐을 방지하는 데 도움이됩니다.

여러 가지 방법으로 수행 할 수 있지만 관심사 ( 구성 )를 사용하는 것이 좋습니다.

# 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

이러한 기능을 컨트롤러에서 분리하여 모델 파일에 넣습니다. 그런 다음 컨트롤러에 모델 파일을 포함시킵니다.

참고URL : https://stackoverflow.com/questions/5767222/rails-call-another-controller-action-from-a-controller

반응형