2013-01-24 31 views
0

所以我就遇到了這個問題範圍的路線和的form_for:form_for and scopes, rails 3我如何重寫Rail Route Helper中的方法(PUT vs GET)?

我的問題更糟糕的是,雖然因爲我不只想範圍內的所有方法,我想大家是在除了GET「/管理員」 /節目。

所以我的routes.rb有這樣的事情:

scope '/admin' do 
    resources 'lessons', except: [:show] 
end 
get "lessons/:id" => "lessons#show", :as => "lesson" 

運行rake路線事實上確實表現出我想要的東西,其中lesson_path的只是方法不同的兩個版本,PUT VS GET。因此,解決辦法他人提供,你做這樣的事情:

url = @lesson.persisted? ? lesson_path(@lesson) : lessons_path 
form_for @lesson, url: url do 

對我不起作用,因爲lesson_path(@lesson)將始終返回不具有仍打破了/管理前綴GET路徑我形成。

所以我不明白的是,我可以在rails路徑助手中指定方法,以便它將使用以/ admin開頭的路徑嗎?還是有一種完全不同的方式來解決這個問題?我知道我可以山洞,只是通過改變歧義:

get "lessons/:id" => "lessons#show", :as => "lesson" 

get "lessons/:id" => "lessons#show", :as => "show_lesson" 

但在這一點上,我只是想知道,如果它是可能的,如果是的話什麼是「正確的」辦法。

+0

順便說一句,我目前通過簡單的前綴,我用「/管理員」這絕對是一個糟糕的解決辦法手動生成的PUT案件的網址有這方面的工作。 – eagspoo

回答

0

我認爲你正在尋找這樣的語法:

<%= form_for [:admin, @lesson] do |f| %> 
    # form goes here 
<% end %> 

這將構建稱爲admin_lesson_path如果@lessonpersisted?,或admin_lessons_path多態性路線助手,如果它不是。該admin_lesson_path助手將通過@lesson對象,這樣的路線將像admin/lessons/1admin_lessons_path將生成/admin/lessons。然後,表格將根據記錄是否被保留而知道是否使用POSTPUT

您可以定義你的路由信息​​的helpe文件是這樣的:

namespace :admin do 
    resources :lessons 
end 

通過這個命名空間控制器,它有幾個優點。其中之一是,你可以把你的所有管理-Y的東西一個單一命名空間的後面,然後從基本控制器使一切事情,從命名空間繼承:

module Admin 
    class LessonsController < BaseController 

    end 
end 

然後BaseController將包含邏輯(作爲before_filter)用於限制用戶是否可以在該控制器中執行動作。

把你的所有管理-Y的東西,這些命名空間控制器內部,你會保持在一個地方所有的管理行爲,而在另一所有面向用戶的操作。如果你聽說過「關注點分離」,那麼這是一個很好的例子。