2010-09-28 63 views
0

我如何設計自己的視圖以便「記住」其路線?所以說「返回」/team/1/members/1鏈接/team/1/members/members/1鏈接返回/members如何創建知道完整路線的視圖。 (Rails 3)

我有型號teammember。球隊有很多成員。

我的路線允許我查看團隊中的所有成員或成員。

resources :teams do 
    resources :members 
    end 
    resources :members do 
    resources :member_parts 
    end 

我目前試圖保持路線一致。但是,我這樣做似乎不得不重複自己,並在視圖中添加許多邏輯。從app/views/members/show.html.erb

<%= link_to 'Edit', params[:team_id].nil? ? edit_member_path(@member) : edit_team_member_path(@member.team,@member) %> | 
<%= link_to 'Back', params[:team_id].nil? ? members_path : team_members_path(@member.team) %> 
+0

相關,但不完全相同:http://stackoverflow.com/questions/3681531/does-anybody-have-any-tips-for-managing-polymorphic-nested-resources-in-rails-3 – hometoast 2010-09-28 15:03:04

回答

1

你可以看看urligecneresource_controller plugin和它的url helpers。它允許你使用object_pathcollection_path,它根據當前的url返回路徑,所以它只是做你想做的。

您還可以添加這個骯髒和醜陋的解決方案:

# application helper 
def collection_path 
    request.request_uri.gsub(/\/[\d]+[\/]*$/, "") 
end 

應該從您的網址的結尾處,刪除字符串,如「/ 2 /」或「/ 14」或「/」。然而,我覺得使用正則表達式的時間非常多,所以要小心這個。

你可以使用這個幫手觀點:

<%= link_to "Back", collection_path %> 

也產生edit路徑,你可以在當前的URL的末尾添加「編輯」的字符串。您可以爲此創建edit_object_path幫手:

def edit_object_path 
    request.request_uri.chop('/') + "/edit" 
end 

但是這又是很骯髒的解決方案,你應該小心。

編輯: 當我看@dombesz的答案,它可能是你在找什麼!

+0

這似乎完全是我需要的。但我(或某人)需要更新它以適應Rails 3。 – hometoast 2010-09-29 11:43:00

2

快速黑客,在Rails3中沒有測試(這完全是錯誤的

摘錄,你可能不得不適應它:

在application_controller.rb

before_filter :store_location 

def store_location 
    session[:return_to] = request.fullpath 
end 

def redirect_back_or_default(default=root_path, flash=nil) 
    session[:return_to] ||= default 
    redirect_to(session[:return_to], flash) 
    session[:return_to] = nil 
end 

在您的航線上

match '/back' => 'application#redirect_back_or_default '

在你的意見

<%= link_to 'Back', '/back' %> 

你也可以在你的行動使用此redirect_back_or_default方法...

+0

This很有趣,但並不完全一樣。我應該澄清一下這個問題。我關心的不是「回」或歷史,因爲它知道視圖是呈現嵌套還是直接呈現。 – hometoast 2010-09-28 16:14:36

+0

它只適用於一個「深」的水平 – klew 2010-09-29 10:38:21

2

更新 更新的代碼,問題是,該方法couldn'因爲我只提供了一個id而不是一個類,所以t認可了這條路。

使用多態路徑。

編輯鏈接:

生成的路徑列

paths = [] 
paths << @member.team if params[:team_id] 
paths << @member 
polymorphic_path(paths,:action=>:edit) 

paths2 = [] 
paths2 << @member.team if params[:team_id] 
paths2 << :members 
polymorphic_path(paths2) 

欲瞭解更多信息,請參見Rails api

希望這將是一個很好的起點。

+0

我無法得到這個工作 - 我猜我做錯了。 – hometoast 2010-09-29 12:47:04

+0

什麼是錯誤? – dombesz 2010-09-29 13:40:39

+0

for/teams/7/members/66我得到「undefined method'edit_7_member_path'」 – hometoast 2010-09-29 14:25:45