# 컨트롤러를 직렬화할 수 있을까요?

**URL:** https://meta.discourse.org/t/can-you-serialize-a-controller/262156
**Category:** Development
**Created:** [4월 19, 2023, 12:21오전 UTC](https://meta.discourse.org/t/can-you-serialize-a-controller/262156 "2023-04-19T00:21:22Z")
**Posts on this page:** 6
**Page:** 1

<div class="post-metadata">

### Author: ![mqmenchaca](https://avatars.discourse-cdn.com/v4/letter/m/90ced4/32.png) [@mqmenchaca](https://meta.discourse.org/u/mqmenchaca)
#### Post date: [4월 19, 2023, 12:21오전 UTC](https://meta.discourse.org/t/can-you-serialize-a-controller/262156/1 "2023-04-19T00:21:22Z")

</div>

디스코urs 커뮤니티 여러분, 안녕하세요. 비슷한 주제를 찾지 못해서 새로 시작해 보았습니다.

저희 조직의 목적에 맞춰 디스코urs 기능을 확장하기 위해 플러그인을 사용 중입니다. 그중 하나는 `email/unsubscribe/{KEY}`에서 JSON을 렌더링하는 것입니다. 이 옵션들을 디스코urs 인스턴스를 실행하는 서버가 아닌 다른 서버에서 제어하기를 원하기 때문입니다. 해당 엔드포인트는 EmailController의 관할 영역에 있으며, 기본적으로 EmailControllerHelper는 뷰를 렌더링하기 전에 컨트롤러의 인스턴스 변수를 설정합니다. 대신 저는 EmailController를 JSON으로 반환하고 싶습니다.

결국 제 질문의 핵심은 컨트롤러를 직렬화할 수 있는지 여부입니다. 즉, 다음과 같이 컨트롤러에 대한 직렬화기를 정의할 수 있을까요?

```ruby
  class ::EmailController
    # THE FILE THIS MODIFIES: app/controllers/email_controller.rb
    # Return a json

    module ReturnAsJSON
      def unsubscribe
        super

        render EmailUnsubscribeSerializer.new(self, root: false).to_json
      end
    end

    prepend ReturnAsJSON
  end

  class EmailUnsubscribeSerializer < ApplicationSerializer
    attributes :topic, :type, :unsubscribed_from_all, :user

    def user
      BasicUserSerializer.new(object.user, root: false).as_json
    end
  end

```

아니면 무리하게 강제하는 방식이 더 나을까요?

```ruby
  class ::EmailController
    # THE FILE THIS MODIFIES: app/controllers/email_controller.rb
    # Return a json

    module ReturnAsJSON
      def unsubscribe
        super

        render json: {type: @type, unsubscribed_from_all: @unsubscribed_from_all, etc.}
      end
    end

    prepend ReturnAsJSON
  end

```

두 번째 접근 방식은 작동하는 것처럼 보이므로, 첫 번째 방식이 작동하지 않더라도 적어도 괜찮은 우회 방법이 있는 셈입니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [4월 19, 2023, 7:12오전 UTC](https://meta.discourse.org/t/can-you-serialize-a-controller/262156/2 "2023-04-19T07:12:26Z")

</div>

기존 플러그인 또는 discourse 소스에서 `add_to_serializer`를 검색하세요.

---

<div class="post-metadata">

### Author: ![mqmenchaca](https://avatars.discourse-cdn.com/v4/letter/m/90ced4/32.png) [@mqmenchaca](https://meta.discourse.org/u/mqmenchaca)
#### Post date: [4월 19, 2023, 2:39오후 UTC](https://meta.discourse.org/t/can-you-serialize-a-controller/262156/3 "2023-04-19T14:39:26Z")

</div>

@pfaffman 감사합니다. 하지만 제가 찾고 있는 것은 아닌 것 같습니다. 한동안 그 방법을 시도해 봤고(실제로 우리의 커스텀 플러그인에서는 다른 곳에서 사용하고 있습니다), 하지만 여기서는 도움이 될지 모르겠습니다. 제가 볼 수 있는 한, Discourse 저장소의 컨트롤러는 직렬화되지 않습니다. 기존 직렬화기에 추가하려는 것이 아니라, 새로운 직렬화기를 만들려고 합니다.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [4월 19, 2023, 2:49오후 UTC](https://meta.discourse.org/t/can-you-serialize-a-controller/262156/4 "2023-04-19T14:49:32Z")

</div>

아. 그렇다면 Rails 모델과 Ember 모델도 추가해야 합니다. 몇 번 해봤는데도 여전히 매우 혼란스럽습니다.

경로를 추가하는 다른 플러그인을 확인해 보세요. [Subscriptions](https://github.com/discourse/discourse-subscriptions)가 그중 하나이지만, [https://github.com/discourse/all-the-plugins를](https://github.com/discourse/all-the-plugins%EB%A5%BC) 받아서 "route\*"로 검색해 보는 것도 좋습니다. Rails 부분은 `config`에, Ember 부분은 `assets/javascripts/discourse/routes`에 있습니다.

---

<div class="post-metadata">

### Author: ![mqmenchaca](https://avatars.discourse-cdn.com/v4/letter/m/90ced4/32.png) [@mqmenchaca](https://meta.discourse.org/u/mqmenchaca)
#### Post date: [4월 19, 2023, 2:52오후 UTC](https://meta.discourse.org/t/can-you-serialize-a-controller/262156/5 "2023-04-19T14:52:55Z")

</div>

좋습니다, 감사합니다. 우리 사용자가 Discourse의 프론트엔드를 전혀 볼 일이 없으므로, Ember를 사용하지 않는 것으로 넘어갈 수 있을 것 같습니다.

> 여러 번 해봐도 여전히 매우 혼란스럽습니다.

이 말이 조금은 위안이 됩니다. 위에서 언급한 두 번째 방법을 선택하여 새로운 엔드포인트가 필요한지 평가해 보겠습니다. 감사합니다!

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [4월 19, 2023, 2:56오후 UTC](https://meta.discourse.org/t/can-you-serialize-a-controller/262156/6 "2023-04-19T14:56:42Z")

</div>

> [@mqmenchaca](#):
>
> Ember를 사용하지 않아도 될 것 같습니다

그럼 훨씬 쉬워지겠네요 (제게는 특히요). 그래서 라우트를 추가한 후 `/your-new-route.json`을 가져오면 그게 끝이고, Ember에서 만들어야 하는 다른 3~5개(혹은 500개?)의 파일을 피할 수 있습니다.

즉, 라우트를 추가한 후 컨트롤러와 모델을 추가하면 됩니다. 제가 생각하기엔 만들 필요가 있는 파일은 딱 그 3개뿐입니다.
