2017-06-07 7 views
0

私はモデル 'Item'を持っています。それはすべて正常に動作しますが、そのショーの経路には完全に満足していません。私はより多くのSEOのフレンドリーなURLを構築するためにアイテムのテーブルから特定のパラメータを使用したい。だからここに私の質問..私は 'mysite.com/items/1' からの私のショーのアクションURL を変更するにはどうすればよいレール5でショーアクションのカスタムルートを作成する方法は?

ですmysite.com/items/item-name/item- city/item-id 'ここで、item-name、item-city、およびitem-idはそれぞれの特定の項目に対して動的です。

これを宝石なしで達成することは可能でしょうか?はいの場合、どうですか?そうでない場合は、これを最も単純な方法で達成するためにどのような宝石を提案しますか?

おかげ

あなたは、比較的単純な何かをするので、のようなあなたのモデルに to_param方法を追加することにより、レールに忠実にすることができます

答えて

1

:これは何

def to_param 
    "#{id}-#{name}-#{city.name}" 
end 

はあなたのようなメソッドを使用するたびにありますitem_pathの場合、@ item.to_paramメソッドを使用します(これは今の動作で、idを返します)。通常のルートを生成しますが、:id paramをSEOに適したものに置き換えます。

もう一方で、あなたのショー、編集、削除、または更新アクションでコントローラーで(params [:id])を見つけると、それはto_iになります。 id。これは今のところですが、intのto_iはまだintです。アイテム名や都市名を変更するために起こる場合

URLは

/items/56-boston-itemname 

これに他の利点のようになります、それが送信されたすべての適切なURLが、古いURLを変更します電子メールではまだ動作します。この問題への

+0

を呼ぶだろうと信じています。 –

1

一つのアプローチは、グロブルートを使用することです:

http://guides.rubyonrails.org/routing.html#route-globbing-and-wildcard-segments

あなたはこのような何か行うことができるはず:

get 'items/*names/:id', to: 'items#show', as: :item_names_path 

をそして、あなたは*namesで好きな置きます。これを正しくするには少し実験が必要です。私は項目にメソッドを追加してnames配列を作成するかもしれません。

def names 
    [city.name, name].uniq.compact 
end 

その後、私はあなたがどちらのソリューションが優れているitem_names_path(@item.names, @item)

関連する問題