it-swarm.dev

마운트 된 Rails 엔진의 명명 된 경로

나는 다음과 같이 작은 Rails 엔진을 만들고 있습니다 :

mount BasicApp::Engine => "/app"

this answer 사용하면 엔진의 모든 경로가 다음과 같아야합니다.

그러나-(엔진 내부) 이름이 지정된 경로 (엔진 내부에 정의)에 링크하면이 오류가 발생합니다

undefined local variable or method `new_post_path' for #<#<Class:0x000000065e0c08>:0x000000065d71d0>

"rake route"를 실행하면 "new_post"가 명명 된 경로 여야한다는 것을 명확하게 확인하므로, Rails (3.1.0)이 이해할 수없는 이유가 무엇인지 모르겠습니다.

내 config/route.rb (엔진 용)는 다음과 같습니다.

BasicApp::Engine.routes.draw do
  resources :posts, :path => '' do
                resources :post_comments
                resources :post_images
        end
end

나는 그것이 격리 된 엔진이라고 덧붙여 야합니다. 그러나 main_app.root_path와 같은 경로는 정상적으로 작동하지만 root_path는 그렇지 않습니다

37
Markus

옳은 길

최선의 해결책은 엔진의 라우트 프록시에서 도우미 메소드로 사용할 수있는 new_post_path를 호출하는 것입니다. 귀하의 경우 도우미 메소드는 기본적으로 basic_app_engine로 설정되므로 뷰 또는 도우미에서 basic_app_engine.new_post_path를 호출 할 수 있습니다.

원하는 경우 두 가지 방법 중 하나로 이름을 설정할 수 있습니다.

# in engine/lib/basic_app/engine.rb:
module BasicApp
  class Engine < ::Rails::Engine
    engine_name 'basic'
  end
end

또는

# in app/config/routes.rb:
mount BasicApp::Engine => '/app', :as => 'basic'

어느 경우이든 조회 또는 도우미에서 basic.new_posts_path로 전화 할 수 있습니다.

또 다른 방법

또 다른 옵션은 탑재 된 엔진을 사용하지 않고 대신 엔진이 앱에 직접 경로를 추가하도록하는 것입니다. Thoughtbot의 HighVoltage 이 작업을 수행합니다. 많은 엔진을 추가 할 때 네임 스페이스 충돌이 발생할 가능성이 있기 때문에이 솔루션이 마음에 들지 않지만 작동합니다.

# in engine/config/routes.rb
Rails.application.routes.draw do
  resources :posts, :path => '' do
                resources :post_comments
                resources :post_images
  end
end

# in app/config/routes.rb:
# (no mention of the engine)
57
James A. Rosen

에 Rails 4 engine_name 지시문이 작동하지 않았습니다.
엔진 자체보기 또는 컨트롤러에서 엔진 경로에 정의 된 명명 된 경로에 액세스하기 위해 상세 정보를 사용했습니다.

BasicApp::Engine.routes.url_helpers.new_post_path

이것을 더 유용하게 사용하기 위해 간단한 도우미 메소드를 정의하는 것이 좋습니다.

# in /helpers/basic_app/application_helper.rb

module BasicApp::ApplicationHelper
  def basic_app_engine
    @@basic_app_engine_url_helpers ||= BasicApp::Engine.routes.url_helpers
  end
end

이것으로 당신은 지금 사용할 수 있습니다

basic_app_engine.new_post_path

엔진에서 기본 애플리케이션 헬퍼에 액세스해야하는 경우 main_app :

main_app.root_path
9
Epigene

앱에서 아래를 사용하여 엔진 경로에 액세스하십시오.

MyApp::Engine.routes.url_helpers.new_post_path
3
edrich13