2014-02-11 76 views
2

我有兩個不同的獨立可安裝軌道引擎;一個叫做Core,另一個叫做Finance;共享軌道引擎之間的路由問題

核心引擎有一個評論資源和路由問題,如;

Core::Engine.routes.draw do 

    concern :commentable do 
    resources :comments 
    end 

end 

而財務引擎有一個發票模型;

Finance::Engine.routes.draw do 

    resources :invoices, concerns: :commentable 

end 

這兩個引擎都添加了主應用程序的Gemfile和routes.rb文件,如下所示; Gemfile;

gem 'core', path: "../core" 
gem 'finance', path: "../finance" 

routes.rb;

mount Core::Engine, at: "/" 
mount Finance::Engine, at: "/" 

在財務上;發票show.erb的評論形式如下所示;

<%= form_for [@invoice, @comment] %> 

但似乎rails 4不能共享引擎之間的路由問題。我在stackoverflow上發現了很多問題,但仍找不到一個好的解決方案。

也許這在軌道引擎中不可用;有沒有辦法處理這個問題。

謝謝。

回答

1

我不認爲有可能這樣做,因爲每個引擎都是它自己的容器,並且您無法在引擎之間觸及,以執行您正在嘗試執行的操作。

取而代之的是一個模塊,您可以在其中定義了同樣的擔心兩種情況下:

module CommentableConcern 
    def self.included(base) 
    base.instance_eval do 
     concern :commentable do 
     resources :comments 
     end 
    end 
    end 
end 

我認爲這是可以實現這一目標的唯一途徑。

+1

謝謝瑞恩,你救了我的日子。 – Farukca

+0

我一直在爲此奮鬥了幾個小時。我如何在兩個不同的路線集中實際包含這個問題? – joshblour

+0

我也遇到這個問題。由於'comments'是在一個引擎中定義的,其他引擎如何解決它? –

1

掙扎一點點與瑞安的答案(?如何正確包括它在那裏),我想出了以下解決方案,無需顯式地使用concerns但仍共享路線:

# 1. Define a new method for your concern in a module, 
# maybe in `lib/commentable_concern.rb` 

module CommentableConcern 
    def commentable_concern 
    resources :comments 
    end 
end 

# 2. Include the module it into ActionDispatch::Routing::Mapper to make 
# the methods available everywhere, maybe in an initializer 

ActionDispatch::Routing::Mapper.include CommentableConcern 

# 3. Call the new method where you want 
# (this way `concerns: []` does not work) obviously 

Finance::Engine.routes.draw do 
    resources :invoices do 
    commentable_concern 
    end 
end 

這隻猴子補丁ActionDispatch::Routing::Mapper,但只要你只定義新的方法(並且不要觸摸現有的方法),它應該是安全的。

+0

這應該是公認的答案,Ryan的答案似乎並不奏效,正如其他人也發現的那樣,Markus的答案確實奏效。 –