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)
다른 컨트롤러 작업을 호출하는 것은 나쁜 습관입니다.
당신은
- 컨트롤러 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
원하는 경로가 될 수있는 이 작업 매개 변수로 보낼 수 있습니다.
아마도 논리를 도우미로 추출 할 수 있습니까? 도우미는 모든 클래스에서 사용할 수 있으며 제어권을 전송하지 않습니다. 그 안에서 컨트롤러 이름을 확인하여 어떻게 호출되었는지 확인할 수 있습니다.
구출 작문 !
이유를 감안할 때 컨트롤러간에 작업을 호출하는 대신 코드의 공유 부분과 사용자 지정 부분을 분리하도록 컨트롤러를 설계해야합니다. 이렇게하면 코드 중복과 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
'Programming' 카테고리의 다른 글
Julia에서 "기호"는 무엇입니까? (0) | 2020.08.07 |
---|---|
R에서 변수 이름을 지정할 때 선호하는 스타일은 무엇입니까? (0) | 2020.08.07 |
잡히지 않은 ReferenceError : jQuery가 정의되지 않았습니다 (0) | 2020.08.07 |
클라우드, 그리드 및 클러스터의 차이점은 무엇입니까? (0) | 2020.08.07 |
Javascript / HTML5에서 Excel 파일을 구문 분석하는 방법 (0) | 2020.08.07 |