: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
会社を読み込む1を高めることができ、比較はあなたがのために値を生成する方法に応じて調整する必要があります:name
パラメータ。
個人的には、idをクエリとして使用するアプローチが嫌いです。
:あなたは、その後のようなURLを持つことができます
"12-company-name".to_i
=> 12
:私はおそらくのようなものを好むだろう:
/companies/:id
をし、フォーマット\d+-\w+
を持つ任意の文字列をRubyで整数に変換されるという事実を利用します
/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
なぜあなたはURLに2つの情報を持っていますか?どちらも会社を特定していますか?それらのいずれかが重複していませんか? –
あなたのコントローラの 'name'または' company_id'によって会社を読み込みますか?なぜあなたは両方を必要としますか? – spickermann
私は同じ名前の2つのショップを持つことができるので、名前は一義的ではありません。私はIDで企業に取り組んでいます。 URLに名前があることは、ユーザーのための単なる意味論であると考えられます。 – loricelli