2015-06-25 49 views
1

比方說,我有一個經典的博客應用程序的評論和帖子。 在此應用程序中,評論總是嵌套在帖子下。覆蓋Rails路由助手的嵌套資源

GET /posts/:posts_id/comments/:id ... 

我想在某種程度上覆蓋URL助手,以便我可以讓他們像評論不是嵌套的資源。

要求

的意見,才應使用嵌套的網址:

/posts/:posts_id/comments/:id 

我應該能夠做到:

comments_path @comment 

而且

redirect_to @comment 

我已經試過

我能得到的Rails與生成不帶前綴的路由助手:

resources :posts 
scope '/posts/:post_id' do 
    resources :comments 
end 

comments_path(@comment)還是會給我ActionController::UrlGenerationErrorpost_id未設置。

我當然可以手動創建自己的幫助器方法,但我希望rails可以生成幫助器。

從我的理解路線幫手是一個單板圍繞ActionDispatch::Routing::UrlFor。我一直在尋找ActionDispatch::RoutingPolymorphicRoutes,但我無法找到生成的幫助程序如何將模型實例「串行化」爲參數。

是否有可能創建一個模型方法,當路由幫助器將註釋資源轉換爲參數時使用?

我正在考慮沿着to_param的方向行事。

+0

你爲什麼不嘗試這樣的事情! 'resources:posts resources:comments',without'scope'。 –

+0

@jonsnow謝謝,但你顯然不明白這個問題。這會給我'user_comments_path',我需要提供id和post_id。 – max

+0

我知道還有其他的解決方案,如採用裝飾,但我想知道,如果它能夠對模型級別創建替代,這樣我就可以使用開箱幫手。 – max

回答

2

我以前也有類似的要求,這一點,我做了什麼是簡單地創建一個自定義的helper方法,在我的ApplicationController像這樣:

class ApplicationController < ActionController::Base 
    ... 

    def comment_path(comment) 
    post_comment_path(comment.post, comment) 
    end 

    helper_method :comment_path 
end 

這樣的話,你仍然可以在使用comment_path你視圖,助手,控制器等,但它使用完整的嵌套路線。

我不知道是否可以用Rails內部完成,但很簡單,我不認爲這是值得的麻煩。

+0

這是一個可行的選擇,但我希望避免創建'comments_path','comments_url','new_comment_path'等,如果我想要完整的套件的路線助手。也許我可以創建一個使用元編程爲我生成代碼的幫手。 – max

+0

有些路線是不可能的。如果您在帖子下嵌入了評論,您如何獲得'new_comment_path' - 您必須在該場景中提供帖子,您沒有評論可以從中推導出來。最簡單的辦法就是改變你的URL結構 - 聽起來你不希望它們被嵌套,或者你正在尋找淺層嵌套?請參閱第2.7.2節http://guides.rubyonrails.org/routing.html#nested-resources – sevenseacat

+0

我認爲你錯了'new_comment_path = new_post_comment_path(post_id:post.to_param)' – max