2009-10-02 110 views
1

我在做什麼:是否可以將自定義路徑追加到Rails路由的「新」路徑?

我正在建立一個系統,其中有不同類型的帖子。撇開車型,這個問題是關於路線和控制器

基本上/posts/new應該去各種各樣的索引頁,而/posts/new/anything要查找的類型anything再建一個表單創建一個新的。

如何我試圖做到這一點:

隨意忽略這一部分,因爲我可以在錯誤的軌道上完全。

在路由配置:

map.connect '/posts/new', :controller => 'posts', :action => 'new_index' 
map.resources :posts, :path_names => { :new => 'new/:type' } 

在控制器:

class PostsController 
    # implicit: def new_index ; end 

    def new 
    @post = class_for_type(params[:type]).new 
    end 
end 

視圖有代碼看起來在@post來確定哪組的觀點使用的類型。事實證明,這使我獲得了90%的途徑:/posts/new/quip實際上確實將我發送到正確的頁面以創建一個提示,等等。 /posts/new確實將我發送到索引頁面。

問題是雙重的。

  1. 我還是希望有便捷的方法是這樣的:

    <%= link_to 'New Post', new_post_path %> 
    

    但這現在是無效的new_post_path需要:type參數。

  2. 我想盡可能使用一條路線。

+0

這是更好地說,而不是「路徑」路線' – khelll 2009-10-02 11:30:31

+0

不,路線則是另一個概念鏈接到控制器,動作,而params的路徑。 – Trejkaz 2009-10-03 08:55:25

回答

3

彼得Wagenet的解決方案給了我缺少一塊拼圖(:type => nil),它可以讓我做一個行:

map.resources :posts, :path_names => { :new => 'new/:type' }, 
       :requirements => { :type => nil } 

當然,我仍然不得不進入控制器並進行修復使它會從:new操作中呈現new_index.html.erb

(好吧,我想這不是一條線了。)

new_post_path      # => '/posts/new/' 
new_post_path(:type => 'quip') # => '/posts/new/quip' 
new_post_path('quip')    # => '/posts/new/quip' 
0

我想你應該看看Rails的單表繼承: http://juixe.com/techknow/index.php/2006/06/03/rails-single-table-inheritance/

那會做了很多更輕鬆地管理您的文章類型,你有很多車型繼承了全球一個,但基於相同的SQL基礎。

爲了您自己的問題,爲什麼不重新定義new_post_path幫助器方法? 是這樣的:

def new_post_path 
    { :controller => 'posts', :action => 'new', :type => params[:type] } 
end 

類型是現在自動基於參數數組上給出。

+0

(1)我已經在使用STI。就像我說的那樣,這個模型與這個問題的目的無關。 (2)鏈接到new_post_path用於佈局(它在每個頁面上),因此params [:type]可能不存在。因此,當你在這樣一個頁面上時,我想顯示一個索引頁面。確實,我可以重新定義幫助者,儘管我猜想只返回'/ posts/new'。 – Trejkaz 2009-10-03 08:57:48

+0

我應該補充說,我現有的兩線解決方案的主要問題在於它很冒險。如果我再添加3行黑客來解決它,那麼它會變成4行黑客,如果我知道如何按照我的意願去做,它可能是1行路線。 – Trejkaz 2009-10-03 08:59:33

2

如果你能分享的行動生活,那麼你可以設置如下:

# Routes 
map.new_person '/people/new/:type', :controller => :people, :action => :new, :type => nil 
map.resources :people, :except => [:new] 

# Controller 
class PeopleController < ApplicationController 

    def new 
    unless params[:type] 
     render :action => :new_index and return 
    end 

    @post = class_for_type(params[:type]).new 
    end 

end 

這可以讓你保持默認格式的單一路線,以及指定的能力類型:

new_person_path      # => /people/new/ 
new_person_path(:type => 'anything') # => /people/new/anything 
new_person_path(:employee)   # => /people/new/employee