0

我有一個控制器顯示操作,它執行一些操作並呈現視圖,但由於某些自定義路由,我需要在完全不同的控制器中執行完全不同的操作來執行相同的操作並呈現相同的視圖。Rails控制器操作複製

我真的不想複製代碼。有什麼地方可以放兩個地方嗎?

編輯:

我基本上需要從集合#顯示從畫廊#SplitUrl運行以下也:

@collection = Collection.find_by_id(params[:id]) 
if @collection.has_children? 
    @collections = @collection.children 
else 
    redirect_to [@collection, :albums] 
end 

我不能只是redirect_to集合#顯示在畫廊#SplitUrl年底爲重定向導致我的自定義URL丟失,因爲它是一個新的請求。

+0

http://stackoverflow.com/questions/5767222/rails-call-another-controller-action-from-a-controller –

回答

0

您可以將視圖內容放入局部(/app/views/home/_example.html.erb),然後在HomeController中使用render "example"命令。

你談論的「一些東西」代碼可以放在幫助文件/app/helpers/...中,以避免在兩個單獨的控制器中複製代碼,儘管它可能取決於代碼首先要做的事情。

http://guides.rubyonrails.org/layouts_and_rendering.html

這可能提供一般主題的更多信息。

+0

我已在原始帖子中添加更多信息。 – rctneil

0

我認爲最簡單的方法是爲您的新url添加路線定義並將其映射到您現有的controlleraction

喜歡的東西如下:

# config/routes.rb 

# Existing resource 
resources :foos 

# The resource in question 
resources :bars do 
    get :show, controller: 'foos', action: 'show', as: bar_foo_common_show 
end 

注意,這會給你/bar/:id,其中id表示bar資源。因此,在您的foo#show操作中,您的查找器需要在適當的類上執行。這是當幾行黑客代碼被添加時,例如,檢查請求引用者。

我認爲通用代碼移動到一個功能可能application_controller,並呼籲從兩個show的行動,功能會更簡潔的方法,但根據我的理解,你已經除了在application_controller通用代碼類似的情景,並會喜歡嘗試一種不同的方法!

+0

原因是,我有一個路由,我的照片庫路線圖庫#SplitUrl這應該然後拆分「/」上的網址,並找出用戶試圖訪問什麼,因爲我想Url的像/ gallery/collection1name/collection2name/collection3name/album1name我擁有的模型是Collection,Album和Photo,Collection是一個自引用模型,因此Collection可以包含其他集合或專輯,但不能同時存在。有任何想法嗎? – rctneil