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


118

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

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

Rails에서 할 수 있습니까?



POST 또는 GET 작업에 대해 이야기하고 있습니까? GET이면 단순히 해당 작업으로 리디렉션 할 수 있습니다. 그러나 컨트롤러 A에서 원하는 URL로 리디렉션 할 수 있으므로 그 이유는 명확하지 않습니다.
Voldy 2011

답변:


64

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

redirect_to your_controller_action_url

추가 정보 : Rails 가이드

새 액션을 렌더링하려면 :

redirect_to your_controller_action_url and return

5
미안하지만 첫 번째 줄과 두 번째 줄의 차이점은 무엇입니까? 먼저 나머지 코드 줄을 실행 한 다음 리디렉션 할 것이라고 생각합니다. 그 맞습니까?
aks

어쩌면 마지막 예는 오타이고이어야한다 생각하고 render대신 redirect_to. @Spyros, 뭐라고 하시나요?
Magne

1
안녕하세요 @spyros,은 ( redirect_to는) 사용을 허용하지 않으며 post: :method특히 create@ddayan이 처음 요청한대로 다른 컨트롤러의 기존 작업 으로 리디렉션하는 데 특히 유용 할 수 있습니다 . 어떤 상황에서 다른 개체를 만들어야하는 비슷한 상황이 있습니다. 다른 호출 create행동하는 것은 될 수 건조기 ..
SanjiBukai

53

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

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

18
콜백이 계속 실행되도록 controller_you_want하려면 다음을 수행하십시오controller_you_want.process(:action_you_want)
Constantijn Schepens

3
감사! 이는 리디렉션을 원하지 않는 상황에서 매우 유용하며 한 컨트롤러에서 다른 컨트롤러로 작업을 채택하는 빠른 솔루션이 필요합니다. 리디렉션은 정말 다른 것입니다. 또한 : render status: :ok, json: JSON.parse(controller.render(:action_you_want).first)다른 컨트롤러에서 JSON을 반환하기 위해 작동하는 것 같습니다
Yourpalal

1
좋은 대답, 내가 찾던 것. 한 가지 질문-요청 매개 변수가 여기서 취해야하는 형식은 무엇입니까? 나는 그들이 살고 있다고 가정 controller_you_want.request하지만 해시 또는 매개 변수 인스턴스를 전달하는이 발사를 얻을 수 없습니다.
SRack 2017

@SRack에서 무엇을 요청 하시는지 잘 모르겠습니다. 는 params사용할 수있게 controller_you_want을 설정하여 request제 3 라인에. 그것이 당신이 요구하는 것입니까?
Sammy Larbi

1
그것이 있어야 렌더링 레일 5 시도render html: controller_you_want.process(:action_you_want)
나자르 kuliyev

41

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

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

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

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

예:

 def index
   get_variable
 end

 private

 def get_variable
   @var = Var.all
 end

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

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


그렇게하지 말아야한다는 것을 알고 있지만 이것은 내 애플리케이션의 일부가 아니라 애플리케이션을 테스트하고 평가하기위한 것입니다.
ddayan 2011

9
.. 렌더링에서 메서드를 분리 한 다음 필요한 경우 개별 메서드를 호출합니다. 질문 하나만 .. get_variable이제 다른 컨트롤러에서 어떻게 호출 할 수 있습니까?
FloatingRock

1
@FloatingRock이 방금 귀하의 질문 / 의견을 발견했습니다. 몇 가지 옵션이 있습니다. 공통 조상에서 정의 할 수 있거나 공통 믹스 인을 포함 할 수 있습니다
apneadiving

답을 사랑하고, 후행 문장 조각에 대해 확실하지
Gerard Simpson

30

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

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

1
다른 하나는 나에게 적합하지 않은 것 같았습니다. 더 좋아 보이지만 매개 변수를 어떻게 전달합니까?
msanjay

3
@msanjay를 url_for에 다른 매개 변수로 전달할 수 있습니다. 예를 들어 redirect_to url_for(:controller => :controller_name, :action => :action_name, :param1 => :val1, :param2 => :val2)의 의지의 결과 /contorller_name/action_name?param1=val1&param2=val2. 참조 워드 프로세서
아리엘 알론에게

"Module :: MyController"와 같은 컨트롤러에서 "MyOtherController"와 같은 루트 컨트롤러로 redirect_to하려고하면 "module / MyOtherController".. 호출로 해결됩니다. 루트를 호출 할 수있는 방법이 있습니까?
ggez44

12

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

당신은

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


안녕하세요, 모델 방법으로 솔루션 B 랩의 경우 모델이 전혀없는 경우 랩핑하는 방법은 무엇입니까? 우리는 검색 엔진을 개발 중이며 다른 엔진에서 검색 엔진의 검색보기를 호출하려고합니다. 검색 작업에 대한 데이터 모델이 전혀 없습니다.
user938363 2013

@ user938363-두 작업이 모두 동일한 뷰를 렌더링하도록 할 수 있습니다 (해당 작업이 다른 컨트롤러에있는 경우에도). "render"호출 자체는 복제되지만 그 자체로는 한 줄의 복제 일뿐입니다. 그렇게 나쁘지는 않습니다. 렌더 호출에 전달할 매개 변수의 해시를 준비하는 논리가 많은 경우 자체 파일 (예 :의 모델 /models또는의 일반 클래스 또는 모듈 /lib) 로 이동하여 중복을 방지 할 수 있습니다. 유일한 문제는 컨트롤러가 인스턴스 변수를 통해 뷰와 통신하는 경우입니다. 복제를 다른 방법으로 수정해야합니다.
antinome 2014-08-25

새 사용자 (등록)를 생성하는 UserController가 있고 성공하면 SessionsController를 호출하고 사용자를 인증하려는 경우 어떻게해야합니까? 이 경우 어떤 식 으로든 SessionsController를 호출합니다. 이것에 대한 어떤 생각?
dipole_moment 2015 년

왜 나쁜 습관입니까? Sammy Lambi 답변의 문제점은 무엇입니까?
vasilakisfil

7

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


6

구출 작문 !

이유를 감안할 때 컨트롤러간에 작업을 호출하기보다는 코드의 공유 부분과 사용자 지정 부분을 분리하도록 컨트롤러를 설계해야합니다. 이렇게하면 코드 중복과 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

도움이되기를 바랍니다.


2

다음과 같이 작업 내에서 다른 작업을 호출 할 수 있습니다.

redirect_to action : 'action_name'

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

  def action2
  end
end

-6

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


잘못된 제안입니다. 책임을 엉망으로 만들고 MVC를 가리 킵니다. 등 모델의 세션 / 쿠키 호출 문제
아인 Tohvri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.