可以序列化一个控制器吗?

您好,Discourse 社区。我没有找到类似的主题,所以我想开一个。

我正在使用一个插件来扩展 Discourse 的功能,以满足我组织的需要。其中一项功能是从 email/unsubscribe/{KEY} 渲染一个 JSON,因为我们希望从运行 Discourse 实例的服务器以外的服务器来控制这些选项。该端点由 EmailController 管理,默认情况下,EmailControllerHelper 在渲染视图之前为控制器设置实例变量。相反,我想将 EmailController 返回为 JSON。

所以我的基本问题是,是否可以序列化一个控制器?也就是说,我可以像这样为控制器定义一个序列化器吗?

  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

或者我最好硬编码?

  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

第二种方法看起来可行,所以如果第一种方法不行,至少我有一个不错的解决方法。

在现有插件或 discourse 源码中搜索 add_to_serializer

1 个赞

感谢 @pfaffman,但我不认为那是我想要的。我尝试过这条路线一段时间了(而且实际上在我们的自定义插件的其他地方也使用过它),但我不知道它在这里是否有帮助。据我所知,Discourse 仓库中没有控制器被序列化。我不是在尝试向现有的序列化器添加内容,而是在尝试创建一个新的序列化器。

1 个赞

啊。然后你需要添加一个 Rails 模型,然后再为 Ember 添加一个模型。我已经做过好几次了,仍然觉得非常混乱。

看看另一个添加路由的插件。Subscriptions 是其中之一,但你也可以获取 GitHub - discourse/all-the-plugins 然后搜索“route*”。Rails 部分在 config 中,Ember 部分在 assets/javascripts/discourse/routes 中。

1 个赞

好的,谢谢。我可能可以不用 Ember,因为我们的用户根本不需要看到 Discourse 前端。

我已经做了好几次了,仍然觉得非常困惑。

这让我感到些许安慰。我可能会选择上面第二种方案,并评估是否需要新的端点。谢谢!

这样就容易多了(对我来说尤其如此)。所以,在你添加路由后,拉取 /your-new-route.json 即可,然后你就可以避免在 Ember 中创建其他 3-5 个文件(或者说是 500 个?)。

所以你添加路由,然后添加控制器和模型。我认为你只需要创建这 3 个文件。

1 个赞