一個解決辦法是,以與這兩個條件的路線下面的代碼:
map.contact 'contact', :controller => 'messages', :action => 'new', :conditions => { :method => :get }
map.connect 'contact', :controller => 'messages', :action => 'create', :conditions => { :method => :post } # Notice we are using 'connect' here, not 'contact'! See bottom of answer for explanation
這將使所有get請求(直接請求等)使用「新」的行動,併發布請求的「創建」行動。 (還有其他兩種類型的請求:put和delete,但這些都無關緊要這裏)。現在
,形式要在其中創建的消息對象變化
<%= form_for @message do |f| %>
到
<%= form_for @message, :url => contact_url do |f| %>
(表單助手會自動選擇發佈請求類型,因爲這是創建新對象時默認的。)
應該解決你的麻煩。
(這也不會導致地址欄閃爍的其他地址。它絕不會使用另一個地址。)
。
- 解釋爲什麼使用連接在這裏沒有問題 map.name_of_route引用JUST THE PATH。因此,您不需要爲第二條路線設置新的命名路線。您可以使用原來的路徑,因爲路徑是相同的。所有其他選項僅在新請求達到導軌時使用,並且需要知道將它發送到何處。
。
編輯
如果您認爲額外的途徑使有點亂(特別是當你使用它更多的時候),你可以創建一個特殊的方法來創建它們。這種方法不是很漂亮(可怕的變量名稱),但它應該完成這項工作。
def map.connect_different_actions_to_same_path(path, controller, request_types_with_actions) # Should really change the name...
first = true # There first route should be a named route
request_types_with_actions.each do |request, action|
route_name = first ? path : 'connect'
eval("map.#{route_name} '#{path}', :controller => '#{controller}', :action => '#{action}', :conditions => { :method => :#{request.to_s} }")
first = false
end
end
,然後用它像這樣
map.connect_different_actions_to_same_path('contact', 'messages', {:get => 'new', :post => 'create'})
我喜歡,雖然原來的方法...
不會工作,錯誤不會保留在對象上 – 2009-07-05 10:47:02
我也認爲這是一個非常醜陋的解決方案......請參閱我的解決方案。 – 2009-07-05 13:28:58