如何路由到以 id 结尾的页面?
E.G.
before: site.com/messages/8
after: site.com/messages/terrytibbs
我试过了:
match "/messages/:username" => "messages#id"
到目前为止没有运气。只是试图通过将数字替换为当前用户正在与之交谈的用户的用户名来使 url 具有更多意义。
亲切的问候
如何路由到以 id 结尾的页面?
E.G.
before: site.com/messages/8
after: site.com/messages/terrytibbs
我试过了:
match "/messages/:username" => "messages#id"
到目前为止没有运气。只是试图通过将数字替换为当前用户正在与之交谈的用户的用户名来使 url 具有更多意义。
亲切的问候
看看friendly_id gem。我认为这是你需要的。
FriendlyId 是用于 Ruby on Rails 的 slugging 和永久链接插件的“瑞士军队推土机”。它允许您创建漂亮的 URL 并使用人性化的字符串,就好像它们是 Active Record 模型的数字 ID。
使用 FriendlyId,很容易让您的应用程序使用以下 URL:
http://example.com/states/washington
代替:
http://example.com/states/4323454
如果您想要一些简单的东西而不必更改路线等,为什么不这样做:
class Message
def to_param
"#{id}-{username}"
end
...
end
假设您的消息中有用户名属性。这将使您的网址看起来像:
site.com/messages/8-terrytibbs
这是因为以下原因(比如在 irb 中):
"8-terrytibbs".to_i => 8
当 rails 在你的控制器中查找你的消息时,它会对 id 参数做同样的事情。
编辑:这里有一个优秀的 railscast:http ://railscasts.com/episodes/63-model-name-in-url和更新版本:http ://railscasts.com/episodes/63-model-名称在 URL 修订
您的路线设置正确,您必须更改控制器以使用正确的参数。
假设您的 MessagesController 确实:
def id
User.find(params[:id])
end
改成:
def id
User.find_by_username(params[:username])
end
我还建议在用户名上添加索引。
您在正确的轨道上,您只需要确保路线指向控制器上的正确操作,如下所示:
假设您希望 this 指向的操作是 named show
,这是您定义路线的方式:
match 'messages/:username' => 'messages#show'
然后,如果您导航到messages/8
,params[:username]
将设置为'8'
( 参数始终以String
's.
同样,如果您导航到messages/terrytibbs
,params[:username]
将设置为'terrytibbs'
。
尝试阅读Rails 路由指南的第 3-3.5 章,它很好地概述了如何将参数绑定到您正在尝试做的路由。