2016-12-26 31 views
0

私はこの形式のURLを持っています。urlパラメータが変更された場合のURLのリフレッシュ

例えばので
/companies/:name?id=company_id 

ABC社、IDが1であると仮定して、誰かがidパラメータの値を変更した場合、新しいIDを持つ会社はcorrectyロードされ、その図であるURL

/companies/ABC?id=1 

として持っていますが表示されますが、URLには以前の会社名が表示されます。例えば 、ID 2

/companies/ABC?id=2 

代わり

/companies/DEF?id=2 

そのIDの変更をチェックし、正しい会社名とURLをリロードする方法はあり

の有する第二会社のDEFを持ちますか?
ありがとうございます。

+1

なぜあなたはURLに2つの情報を持っていますか?どちらも会社を特定していますか?それらのいずれかが重複していませんか? –

+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 

会社を読み込む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 
+0

私は実際にbefore_filterのアイデアがどのように私に来なかったのか知らない。ありがとう、それは私の問題を解決し、また、そのレール機能を発見します。どうもありがとうございました。 – loricelli

関連する問題