컨트롤러 B에서 컨트롤러 A의 생성 작업을 호출해야합니다.
그 이유는 컨트롤러 B에서 호출 할 때 다른 방식으로 리디렉션해야하기 때문입니다.
Rails에서 할 수 있습니까?
컨트롤러 B에서 컨트롤러 A의 생성 작업을 호출해야합니다.
그 이유는 컨트롤러 B에서 호출 할 때 다른 방식으로 리디렉션해야하기 때문입니다.
Rails에서 할 수 있습니까?
답변:
해당 작업에 대한 리디렉션을 사용할 수 있습니다.
redirect_to your_controller_action_url
추가 정보 : Rails 가이드
새 액션을 렌더링하려면 :
redirect_to your_controller_action_url and return
render대신 redirect_to. @Spyros, 뭐라고 하시나요?
redirect_to는) 사용을 허용하지 않으며 post: :method특히 create@ddayan이 처음 요청한대로 다른 컨트롤러의 기존 작업 으로 리디렉션하는 데 특히 유용 할 수 있습니다 . 어떤 상황에서 다른 개체를 만들어야하는 비슷한 상황이 있습니다. 다른 호출 create행동하는 것은 될 수 건조기 ..
다른 컨트롤러에서 하나의 컨트롤러를 사용하려면 다음과 같이하십시오.
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
controller_you_want하려면 다음을 수행하십시오controller_you_want.process(:action_you_want)
render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)다른 컨트롤러에서 JSON을 반환하기 위해 작동하는 것 같습니다
controller_you_want.request하지만 해시 또는 매개 변수 인스턴스를 전달하는이 발사를 얻을 수 없습니다.
params사용할 수있게 controller_you_want을 설정하여 request제 3 라인에. 그것이 당신이 요구하는 것입니까?
render html: controller_you_want.process(:action_you_want)
당신이 제시하는 로직은 MVC가 아니고 Rails가 아닙니다.
컨트롤러가보기 또는 리디렉션을 렌더링합니다.
메서드는 코드를 실행합니다.
이러한 고려 사항에서 컨트롤러에 메서드를 만들고 작업에서 호출하는 것이 좋습니다.
예:
def index
get_variable
end
private
def get_variable
@var = Var.all
end
즉, 다른 컨트롤러를 통해 똑같은 작업을 수행 하고 컨트롤러 B에있는 동안 컨트롤러 A 의 메서드 를 호출 할 수 있습니다.
어휘가 매우 중요하기 때문에 제가 많이 주장합니다.
get_variable이제 다른 컨트롤러에서 어떻게 호출 할 수 있습니까?
를 사용 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원하는 경로가 될 수있는 이 작업 매개 변수로 보낼 수 있습니다.
/models또는의 일반 클래스 또는 모듈 /lib) 로 이동하여 중복을 방지 할 수 있습니다. 유일한 문제는 컨트롤러가 인스턴스 변수를 통해 뷰와 통신하는 경우입니다. 복제를 다른 방법으로 수정해야합니다.
구출 작문 !
이유를 감안할 때 컨트롤러간에 작업을 호출하기보다는 코드의 공유 부분과 사용자 지정 부분을 분리하도록 컨트롤러를 설계해야합니다. 이렇게하면 코드 중복과 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
도움이되기를 바랍니다.
이러한 기능을 컨트롤러에서 분리하여 모델 파일에 넣습니다. 그런 다음 컨트롤러에 모델 파일을 포함합니다.