2016-12-26 60 views
0

我有這種格式的網址。刷新URL如果URL參數更改軌道

/companies/:name?id=company_id 

因此,例如ABC公司,假設id爲1,具有如URL

/companies/ABC?id=1 

如果有人更改id參數值,公司與新的ID被correcty加載和視圖顯示,但url不斷顯示以前的公司名稱。 例如,具有ID 2

/companies/ABC?id=2 

而不是

/companies/DEF?id=2 

有沒有一種方法來檢查該ID的變化,並用正確的公司名稱重新加載網址第二家公司DEF?
謝謝你們。

+1

爲什麼你在url中有兩條信息,這兩條信息都可以識別公司?他們不是多餘的嗎? –

+0

您是否在控制器中通過'name'或'company_id'加載公司?你爲什麼需要兩個? – spickermann

+0

名稱不是唯一的,因爲我可以擁有2個同名的商店。我通過id工作在公司。在url中擁有這個名字被認爲是對用戶的一種限制。 – loricelli

回答

0

確保:name:id匹配的唯一方法是比較它們,並在值與預期值不符時重定向。

例如,你可以在你的控制器中添加before_action,或增強一個在這裏裝載公司

before_action :find_company 

def find_company 
    @company = Company.find(params[:id]) 
    # check and redirect 
    if @company.name != params[:name] 
    redirect_to(company_path(...)) 
    end 
end 

當然,比較有進行調整,這取決於你如何產生的價值:name參數。

個人而言,我不喜歡把id作爲查詢的方法。我可能會喜歡的東西,如:

/companies/:id 

,走的事實與格式\d+-\w+任何字符串轉換成整數Ruby的優勢:

"12-company-name".to_i 
=> 12 

然後,您可以有這樣的URL:

/companies/12-company-name 

而且只需使用

Company.find(params[:id].to_i) 

當然,如果您想在名稱與ID不匹配時重定向,您仍然需要執行before操作。

before_action :find_company 

def find_company 
    id, name = params[:id].to_s.split("-", 2) 
    @company = Company.find(id) 
    # check and redirect 
    if @company.name != name 
    redirect_to(company_path(...)) 
    end 
end 
+0

我真的不知道如何before_filter的想法沒有來到我的大聲笑。謝謝,它解決了我的問題,並且我還發現了rails功能。非常感謝你。 – loricelli