컨트롤러와 라우트

커스텀 컨트롤러 설정 튜토리얼과 라우트를 따라 진행했을 때 라우팅 오류(Routing Error) 페이지가 표시됩니다. 해당 페이지에는 경로와 컨트롤러가 나열되어 있는데, 이 부분 자체는 모두 정확합니다. 하지만 리소스를 요청하면 오류가 발생합니다. 이 튜토리얼이 오래된 것임을 알고 있지만, 정보의 정확성은 유지되는지 궁금합니다. 플러그인 스켈레톤을 첨부했으니, 문제를 해결하는 데 도움을 주실 수 있는 분이 계신지 모르겠습니다. 감사합니다!

jb-test.zip (522.2 KB)

당신이 놓치고 있는 부분은 Rails 라우팅에 추가하는 것입니다.

plugin.rb에 다음과 같은 코드를 추가하면 됩니다.

  JbTest::Engine.routes.draw do
    get "/hello" => "jbtest#index"
  end

이것으로 시작할 수 있습니다. 해야 할 다른 일은 GitHub - discourse/all-the-plugins · GitHub 저장소를 받아서 살펴보는 것입니다. 다만, 많은 것들이 이제 코어에 추가되었으므로, Rails 라우트에 추가된 예시를 코어에서 확인하는 것도 좋습니다.

Discourse용 최소 커스텀 라우트 플러그인 AI

pfaffman:

Discourse rails에 라우트를 추가하려면 무엇이 필요한가요?

plugin.rb, 컨트롤러, 그리고 rails에 라우트를 추가하는 데 필요한 코드를 포함한 최소한의 개념 증명(minimal proof of concept)을 보여줄 수 있나요?

DiscourseHelper:

검색 중

검색 내용: 플러그인을 사용하여 Discourse에 커스텀 라우트를 추가하는 방법, plugin.rb, 커스텀 컨트롤러, Rails 라우트를 등록하는 데 필요한 코드가 포함된 최소 예시?

읽는 중

읽은 내용: Developing Discourse Plugins - Part 1 - Create a basic plugin

검색 중

검색 내용: Discourse 플러그인에서 커스텀 Rails 라우트를 추가하는 최소 개념 증명, plugin.rb, 컨트롤러 구현, 라우트 등록 코드를 포함.

읽는 중

읽은 내용: Creating Routes in Discourse and Showing Data

읽는 중

읽은 내용: Add custom user routes using plugins

읽는 중

읽은 내용: Adding a ruby controller via plugin

플러그인을 통해 Discourse에 커스텀 Rails 라우트를 추가하는 최소 개념 증명을 제공합니다. 필요한 주요 파일인 plugin.rb, 컨트롤러, 라우트 등록 코드를 포함합니다.

주요 포인트

  • 플러그인 내에서 컨트롤러와 라우트를 격리하기 위해 Rails "엔진(engine)"을 사용하는 것이 가장 좋은 관행입니다.
  • plugin.rb에서 컨트롤러를 명시적으로 require해야 합니다.
  • 새 라우트를 등록하려면 엔진의 routes.draw 메서드를 사용하고 메인 애플리케이션 라우트에 엔진을 마운트(mount)해야 합니다.

최소 예시

plugin.rb

# name: my-custom-route
# about: Adds a custom route via Rails engine in a plugin
# version: 0.1
# authors: Your Name

after_initialize do
  module ::MyPlugin
    class Engine < ::Rails::Engine
      engine_name "my_plugin"
      isolate_namespace MyPlugin
    end
  end

  require_dependency File.expand_path('../app/controllers/my_plugin/my_controller.rb', __FILE__)

  MyPlugin::Engine.routes.draw do
    get "/hello" => "my#hello"
  end

  Discourse::Application.routes.append do
    mount ::MyPlugin::Engine, at: "/my_plugin"
  end
end

app/controllers/my_plugin/my_controller.rb

module MyPlugin
  class MyController < ::ApplicationController
    def hello
      render plain: "Hello from my plugin!"
    end
  end
end

동작 방식:

  • GET /my_plugin/hello 요청 시 "Hello from my plugin!"라는 일반 텍스트 응답을 반환합니다.

필요한 디렉토리 구조:

plugins/
  my-custom-route/
    plugin.rb
    app/
      controllers/
        my_plugin/
          my_controller.rb

자세한 내용과 확장된 예시는 다음을 참조하세요:

이 개념 증명은 플러그인을 통해 Discourse 인스턴스에 간단한 커스텀 엔드포인트를 추가하는 데 도움이 됩니다. Ember/JS 쪽과 통합하는 방법에 대해 질문이 있다면 알려주세요!

네, 감사합니다. 그 코드 조각이 routes.rb에 추가된 것 같은데, 코어 플러그인을 살펴보고 plugins.rb에서 예제를 찾아볼게요. 감사합니다!