4

Stackoverflow 的网址是这样的:

http://stackoverflow.com/users/12345/name-of-user

它具有真正 RESTful 路由的所有属性:

:resource_name/:resource_id

但它也有一个片段name之后的:resource_id一部分。我知道如何使用 Rails 的 Non-Resourceful Routes 来实现它。但是是否可以使用其内置的默认resources :user方法来实现相同的 url?

默认情况下,第三段是 Rails 中的格式:

/users/:id(.:format)      users#show
4

3 回答 3

1

我知道这是一个老问题,但它似乎仍然引起了一些兴趣。所以我会发布我想出的。

我不知道你想多远,但是这个,在全球范围内,是有效的:

resources :articles do
  member do
    get '*slug', to: 'articles#show', as: 'slugged'
  end
end

这也有效:

resources :articles do
  member do
    get ':slug', to: 'articles#show', as: 'slugged'
  end
end

在这两种情况下,您都可以使用

 <%= link_to slugged_article_path(article, article.title.parameterize) %>

在您的视图中(您可能希望在模型中为 slug 定义一个虚拟属性,而不是article.title.parameterize在视图中动态构建它)。

请注意,到目前为止,如果您在浏览器中输入任何内容作为 slug,Rails 不会抱怨。

我个人觉得足智多谋的方法有点冗长,因为我只对显示操作的漂亮网址感兴趣(这是普通用户或搜索引擎机器人可能看到的唯一网址),所以我觉得简单做起来更简单:

resources :articles
get 'articles/:id/:slug', to: 'articles#show', as: 'slugged_article'
于 2016-02-27T11:37:39.903 回答
0

假设您有一个控制器questions_controller

在 routes.rb 中:

get 'questions/:id/:slug', to: 'questions#show'

在 questions_controller.rb 中:

def show
  @question = Question.find(params[:id])
  if request.path != question_path(@question)
    redirect_to @question, status: :moved_permanently
    return
  end
...
end

有问题.rb:

def to_param
  "#{id}/#{name.parameterize}"
end

而已。所有生成的路径都将包含 slug,如果尝试访问/questions/42, 或/questions/42/incorrect-slug,您将被重定向。

于 2013-07-14T17:51:25.480 回答
0

您可以使用FriendlyId。Github中有一个存储库,并且有据可查。Ryan bates 还在 RailsCasts中制作了一个非常好的视频教程

于 2013-05-27T06:47:42.727 回答