我有这种格式的网址。
/companies/:name?id=company_id
因此,例如ABC公司,假设id为1,则为url
/companies/ABC?id=1
如果有人更改了id参数值,则会正确加载具有新ID的公司,并显示其视图,但网址会一直显示以前的公司名称。 例如,拥有第二个公司DEF,ID为2
/companies/ABC?id=2
而不是
/companies/DEF?id=2
有没有办法检查ID更改并使用正确的公司名称重新加载网址?
谢谢你们。
答案 0 :(得分: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
然后您可以拥有以下网址:
/companies/12-company-name
只需使用
即可Company.find(params[:id].to_i)
当然,如果您想在名称与ID不匹配的情况下重定向,您仍然需要先行动。
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