2012-08-07 80 views
0

我有問題與Rails路由器和表單生成器一點點。 我的應用程序有模型和控制器的命名空間模塊。模塊用於更容易抽象到另一個項目。沒有模塊前綴路徑路徑的Rails namescoped模型對象

我在routes.rb範圍內使用方法來代替命名空間,因爲我不會有「醜陋的」路徑助手。

它看起來像:

scope module: :taxonomy do 
    resources :taxonomies do 
    resources :terms 
    end 
end 

問題是,當我想編輯分類(網址:taxonomies/1/edit):因爲我的路線是不是僅僅taxonomy_path

undefined method `taxonomy_taxonomy_path' 

我得到一個錯誤

有什麼辦法如何達到form_for @taxonomy認識到這條路線的作用域?沒有使用form_for @taxonomy, url: taxonomy_path(@taxonomy)這是不治癒。由於內respond_with @taxonomy在控制器方法@taxonomy對象總是refereces到taxonomy_taxonomy_url

我的模型:

module Taxonomy 
    class Taxonomy < ActiveRecord::Base 
    has_many :taxonomy_terms, inverse_of: :taxonomy 
    has_many :terms, through: :taxonomy_terms 
    class Term < ActiveRecord::Base 
    has_one :taxonomy_term, inverse_of: :term 
    has_one :taxonomy, through: :taxonomy_term 

和控制器:

module Taxonomy 
    class TaxonomiesController < ApplicationController 

回答

4

您可以通過重寫的ActiveRecord的型號命名:

module Taxonomy 
    class Taxonomy < ActiveRecord::Base 
    def self.model_name 
     ActiveModel::Name.new("Taxonomy") 
    end 
    end 
end 

這將覆蓋ActiveRecord的默認命名代其爲分類學類生成taxonomy_taxonomy名字,因爲它是根據分類模塊。 它應該解決您的路由名稱問題,並根據您的意願生成合適的路由名稱。

+0

我對此有一個疑問。當我不想訪問沒有命名空間前綴「Taxonomy ::」的模型時,使用命名空間更改模型名稱的解決方案是完美的。但是有什麼問題應該是至關重要的,比如模塊模型的隔離性差,非標準的Rails行爲或者其他什麼? – rado 2012-08-07 10:59:32

+0

我沒有完全理解你的問題 - 你的意思是你現在在你的代碼中通過'Taxonomy'而不是'Taxonomy :: Taxonomy'訪問類Taxonomy? – 2012-08-07 11:05:01

+0

我的不好,當然不是,它叫做Module,而不是Model。我的問題是,當我只想路由路徑/ URL爲無前綴時,更改模型名稱不是對立的。像升級Rails等未來的問題一樣...... – rado 2012-08-07 11:09:59

2

試試這個在routes.rb中:

namespace :taxonomy do 
    resources :taxonomies do 
    resources :terms 
    end 
end 

這可能需要您存儲您的控制權在名爲taxonomy的子目錄中也是如此。

+0

這有效,但路徑是taxonomy_前綴。我使用「示波器模塊」來創建更漂亮的路徑。 – rado 2012-08-07 10:40:08