2013-08-06 123 views
4

在我routes.rb我有以下幾點:Rails的渲染「行動」自定義URL

get "contact" => "inquiries#new" 

所以,當我去/contact在browswer,它調用InquiriesControllernew行動。

現在,當我嘗試調用render "new"在創建行動中InquiriesController

def create 
    … 
    render "new" 
end 

在瀏覽器中所得網址爲/inquiries

除了撥打redirect_torender "new"之外還有什麼方法可以在瀏覽器中使用url作爲/contact嗎?

+0

我同意你應該redirect_to如果你想要你的地址是/聯繫,但爲什麼這樣做?我認爲你的訪問者沒有任何問題可以看到從聯繫人到查詢的鏈接改變! – medBo

回答

10

簡短答案是否定這裏的原因:

render不同於redirect_to。當您編寫redirect_to :action時,您正在啓動一個全新的瀏覽器請求。擊中軌道堆棧,再次搜索路線並執行相應的操作。它與在地址欄中輸入網址並按下回車完全相同。

另一方面,當您使用render時,您正在告訴哪個視圖用於當前請求。因此,地址欄中的地址通常是您致電render的操作。這是因爲你放了一個地址,然後你告訴軌道在同一請求中顯示不同的頁面。

簡而言之,雖然redirect_to開始一個全新的請求週期,但render只是將您在默認視圖中選擇的默認視圖替換爲相同的請求週期。

所以,如果你想要更改地址欄,你將不得不發起一個新的請求到你想要的地址。可以通過手動輸入地址,單擊該地址的鏈接或從導軌重定向到該地址。

希望這會有所幫助。

+1

是不是可以調用一些JavaScript代碼來改變它? Turbolinks已經在做與瀏覽器歷史和AJAX請求類似的東西。 「不」最有可能過時。 –

5

解決方案是使用自定義路由,如果您使用Restful路由,您可以簡單地將此行添加到您的路由。RB:

resources :inquiries, path: "contact", as: :inquiries, only: [:create] 

在這裏你告訴Rails默認inquiriescontact改變URL時動作的名稱是create

,如果你希望其他行動來匹配網址是開始與contact,只需將行動的名稱添加到「只有」,例如:only: [:create, :update ...]

如果你想allactions in that controller(查詢)進行定製,以"contact"只是刪除only這樣的:

resources :inquiries, path: "contact", as: :inquiries 

,疑問的所有路由控制器將從/inquiries有關如何定製寧靜的變化/contact

瞭解更多詳情路線請檢查此link

3

在創建操作中使用render :new時,它將使用表單發佈到的相同URL。

因此,如果你想建立雙方的詢問,你可以設置你的路線,如:

get '/contact', 'inquiries#new', as: 'contact' 
post '/contact', 'inquiries#create' 

您也可以使用resources方法medBo引用,但我只是喜歡老式get和當我正在做自定義的事情時。此外,這些路線可以與您現有的查詢路線共存,不會有任何不良影響。

然後用這些路由集,您可以通過書面形式創建聯繫人:

<%= form_tag contacts_url do %> 
    ... 
<% end %> 

這裏最重要的一步,是我們設立的形式張貼到`/接觸「而不是發佈到」 /查詢。

+0

這工作完美,謝謝你的幫助:) – george