如果url参数在rails

时间:2016-12-26 11:30:02

标签: ruby ruby-on-rails-4 url model-view-controller

我有这种格式的网址。

/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更改并使用正确的公司名称重新加载网址?
谢谢你们。

1 个答案:

答案 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