0

ID で終わるページにルーティングするにはどうすればよいですか?

E.G. 
before: site.com/messages/8
after:  site.com/messages/terrytibbs

私はもう試した:

match "/messages/:username" => "messages#id"

これまでのところ運がありません。数字を現在のユーザーが話しているユーザーのユーザー名に置き換えることで、URLをもう少し意味のあるものにしようとしています。

敬具

4

4 に答える 4

1

ルートなどを変更せずに単純なものが必要な場合は、次のようにしてください。

class Message

  def to_param
    "#{id}-{username}"
  end

...
end

メッセージにユーザー名属性があると仮定します。これにより、URL は次のようになります。

site.com/messages/8-terrytibbs

これは次の理由で機能します(irbで言う):

"8-terrytibbs".to_i => 8

レールがコントローラーでメッセージを検索すると、idパラメーターに対して同じことが行われます。

編集: ここに優れた Railscast があります: http://railscasts.com/episodes/63-model-name-in-urlとここに更新されたバージョン: http://railscasts.com/episodes/63-model-改訂された URL 内の名前

于 2013-02-01T20:14:09.007 に答える
1

Friendly_id gemを見てください。必要なものだと思います。

FriendlyId は、Ruby on Rails のスラッギング プラグインとパーマリンク プラグインの「スイス アーミー ブルドーザー」です。これにより、きれいな URL を作成し、Active Record モデルの数値 ID であるかのように、わかりやすい文字列を操作できます。

FriendlyId を使用すると、アプリケーションで次のような URL を簡単に使用できます。

     http://example.com/states/washington

それ以外の:

     http://example.com/states/4323454
于 2013-02-01T19:40:25.363 に答える
0

ルートが正しく設定されているため、正しいパラメーターを使用するようにコントローラーを変更する必要があります。

MessagesController が次のことを行うと仮定します。

def id
  User.find(params[:id])
end

への変更:

def id
  User.find_by_username(params[:username])
end

ユーザー名にインデックスを追加することもお勧めします。

于 2013-02-01T20:08:20.690 に答える
0

次のように、ルートがコントローラーの適切なアクションを指していることを確認する必要があります。

これが指すアクションの名前showが であるとします。ルートを定義する方法は次のとおりです。

match 'messages/:username' => 'messages#show'

次に、 に移動するとmessages/8params[:username]が設定され'8'ます (パラメータは常にString's.

同様に、 に移動するとmessages/terrytibbsparams[:username]が に設定され'terrytibbs'ます。

Rails Routing Guide の Chapter 3-3.5 を読んでみてください。これは、あなたがしようとしているようにパラメータをルートにバインドする方法の概要を提供します。

于 2013-02-01T20:29:05.817 に答える