2012-02-15 28 views
2

私はレール3アプリを持っていて、今は私のカタログのフィルタを実装しています。フィルタは、GET要求を介してコントローラにデータを渡します。Rails 3 - Friendly params in url(GET)

http://localhost:3001/shoes?filter%5BShoeBottomType%5D%5B%5D=2&filter%5BShoeClassification%5D%5B%5D=1&filter%5BShoeClassification%5D%5B%5D=2&filter%5BShoeElation%5D%5B%5D=3&filter%5BShoeElation%5D%5B%5D=4&filter%5BShoeElation%5D%5B%5D=5&filter%5BShoeLiningColor%5D%5B%5D=2&filter%5BShoeLiningColor%5D%5B%5D=3&filter%5BShoeLiningColor%5D%5B%5D=4&filter%5BShoeTopColor%5D%5B%5D=1&filter%5BShoeTopColor%5D%5B%5D=2&filter%5Bonly_action%5D%5B%5D=1&page=2 

はURLをより美しく行う方法があります:私は私の フォーム(適用検索)を提出した後、その結果として、私は私のブラウザでは、このようなリンクがありますか?私はそれがSEO

答えて

7

TLDR:そのまま残してください。

HTMLフォームは簡単な方法でシリアル化されます。パラメータにはHTML要素の名前が付けられます。ここでの実際の問題は、フォーム要素の名前付け方法です。彼らはfilter[ShoeBottomType][]のような名前を持っているようです。あなたのHTMLを見て、nameの属性を見てください。あなたがRailsに入っているので、Railsコントローラメソッドに渡されたフィルタハッシュを1つの引数として渡し、Railsはハッシュが特定のURLを使用することを期待しているので、ハッシュと配列に対してformat(デシリアライズリクエストから)、フォームヘルパーはそのようにフォームを書き込みます。ハッシュ値は配列なので、あなたのものは特に複雑です。したがって、余分な括弧のセットです。その後、URLエンコードされ、あなたは醜い混乱に終わります。

大きなハッシュではなく入力を個別にコントローラに戻すことで、この問題の一部を回避できます。次のようなものがあります:

def index 
    shoe_bottom_types = params[:bottom_types] 
    shoe_classifications = params[:classifications] 
    shoe_elations = params[:elations] 
    ... 

/shoes?bottomTypes[]=1&bottomTypes[]=2...それははるかに良いとは思われません、そして今あなたのコントローラはすべて総体です。同じフィルターを複数用意したい場合、どのようにブラケットを完全に取り除くのか分かりません。 shoeBottomTypes=1|2を壊すような、あなたのコントローラであなた自身の構文解析を行うことはできますが、あなた自身のフォームのシリアル化も行う必要があります。再び、それだけの価値はない。

秒間バックアップすると、SEOのことはあまり意味がありません。検索エンジンはあなたのフォームに記入しません。彼らは単にリンクをたどります。あなたがGETを使うべき本当の理由は、あなたのフォームを提出することは単なる検索であるので、副作用がないということです(おそらく)。 hereを参照してください。適切なHTTPメソッドを使用することが重要です。 POSTを使用すると、リロード時に奇妙な警告が表示され、検索をブックマークできなくなります。

さらにバックアップすると、なぜSEOが外れているのですか?ただ、迅速なデモとして、私は言葉「もの」のためのGoogle検索を行なったし、これはURLでした:

https://www.google.com/#hl=en&output=search&sclient=psy-ab&q=thing&pbx=1&oq=thing&aq=f&aqi=g2g-s1g1&aql=1&gs_sm=3&gs_upl=764l1877l0l1980l6l6l0l0l0l0l89l432l5l5l0&bav=on.2,or.r_gc.r_pw.r_cp.r_qf.,cf.osb&fp=220ef4545fdef788&biw=1920&bih=1086

だから、フォームの提出のためのURLが長くなることがあります。ユーザーはそれを見ることさえしません。

ここであなたのURLの長さ/醜さを気にする理由は、フォームとは別に特定の検索へのリンクを作成することだけです。それを処理するにはいくつかの方法がありますが、それがあなたに関連するかどうかわからないので、私はそれをフォローアップにします。

だから私は期待しているように見えますが、それを修正しようとすると醜いと無意味な音。

0

あなたはPOSTリクエストを使用しない場合のために悪いことを読んでいるので

PS iは、利用POSTリクエストをたくない、その後にフォームの値を入れて、その後他の方法はありませんURL - サーバーに何らかの形で到達する必要があります。

しかし、私はなぜPOSTを行うことがSEOにとって悪いのか分かりませんが、私はそう述べた記事を見たいと思っています。

+0

たとえば、訪問者がサイトにアクセスし、いくつかのフィルタを選択し、結果を見てから、彼/彼女/彼女の友人と共有する(リンクを取得したい)。 looooongリンクの私の亜種では、友人がこのリンクを開くと、同じ結果が表示されます。 POSTを介して動作する場合、リンクはhttp:// localhost:3001/shoesのようになり、友人はフィルタリングなしですべての結果を表示します。私は明確に説明してくれることを願っています –

+0

URLにフィルタを入れる代わりに、フォームや結果をデータベースに保存し、ある種のパーマリンクメカニズム( '' http:// localhost/shoes?filter = 25 ")。いずれにしても、これがSEOにどのような影響を与えるかはわかりません。私はまだそれを言った記事を見たいと思う。 – Laurens

+0

私はwill_paginate gemを使用しています(そして、私は例として示す描画リンクを表示します)。だから... will_paginate + ajaxを使ってみてください。 –

0

あなたのURLを美しくするカスタムルートを追加することができます。

例えば

http://localhost:3001/shoes/Type/2/Classification/1,2/Elation/3,4,5/LiningColor/2,3,4/TopColor/1,2/only_action/1/page/2

これはあなたの最初のURLよりもはるかにはるかに短いです;)

の相手私の知る限り、あなたはでのparamsのために常に同じ順序を使用する必要があり、ということですあなたのURL。

ルーティングルールは以下の通りです:

match "shoes/Type/:type/Classification/:classification/Elation/:elation/LiningColor/:liningcolor/TopColor/:topcolor/only_action/:only_action/page/:page" => "shoes#show" 

あなたはparams配列で渡された値を取得することができます。複数の値を取得するには、,を含む文字列を分割する必要があります。

+1

カスタムのシリアライゼーション/ストリング分割ルートを使用する場合は、URLパラメータ「shoes-type = 2&classification = 1,2&elation = 3,4,5」を使用することに固執します。これにより、カスタムルートと不規則な注文の制約が緩和されます。また、おそらくフィルタはオプションですか? –

+0

私は全く同意します。 –