確保: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
爲什麼你在url中有兩條信息,這兩條信息都可以識別公司?他們不是多餘的嗎? –
您是否在控制器中通過'name'或'company_id'加載公司?你爲什麼需要兩個? – spickermann
名稱不是唯一的,因爲我可以擁有2個同名的商店。我通過id工作在公司。在url中擁有這個名字被認爲是對用戶的一種限制。 – loricelli