加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – Ruby on Rails:如何覆盖资源的’show’路由?

发布时间:2020-12-16 20:08:19 所属栏目:百科 来源:网络整理
导读:目前我有一条如下所示的路线: resources :posts 我想覆盖’show’动作,以便我可以显示一个这样的URL: posts/:id/:slug 我目前可以通过添加自定义匹配路由来做到这一点: resources :postsmatch 'posts/:id/:slug' = 'posts#show' 但是,当我使用link_to帮助
目前我有一条如下所示的路线:
resources :posts

我想覆盖’show’动作,以便我可以显示一个这样的URL:

posts/:id/:slug

我目前可以通过添加自定义匹配路由来做到这一点:

resources :posts
match 'posts/:id/:slug' => 'posts#show'

但是,当我使用link_to帮助器时,它不会使用我的自定义显示路由.

<%= link_to 'show',post %>  # renders /posts/123

我如何定义我的show路由,以便我仍然可以使用link_to帮助?

更新:您可以阅读以下答案,您可以覆盖“show”操作的路由,但它可能比值得更多的工作.创建自定义路线更容易:

# config/routes.rb
match 'posts/:id/:slug' => 'posts#show',as: 'post_SEO'

# app/views/posts/index.html.erb
<%= link_to post.title,post_SEO_path(post.id,post.slug) %>

解决方法

你有两条路线指向#show(你应该可以通过运行rake路线来确认),你的链接使用错误的路线.

当你调用link_to(‘show’,post)链接的URL是通过调用url_for(post)生成的(最后,在通过其他几种方法之后)调用post_path(post).由于通过调用资源(:posts)创建的帖子#show的路由被命名为post,这就是post_path生成的路由.

您目前还有不一致的路线,显示,更新和销毁行为,这可能会导致您以后出现问题.

您可以通过将路由更改为以下方法来解决此问题:

resources :posts,:except => ['show','update','destroy']
get    'posts/:id/:slug' => 'posts#show',:as => 'post'
put    'posts/:id/:slug' => 'posts#update'
delete 'posts/:id/:slug' => 'posts#destroy'

不幸的是,您仍然无法使用link_to(‘show’,post),因为它依赖于能够使用post.to_param作为构建一个帖子路径所需的单个参数.您的自定义路线需要两个参数,一个id和一个slug.所以现在您的链接代码将需要如下所示:

link_to 'show',post_path(post.id,post.slug)

您可以通过在app / helpers / posts_helper.rb中定义自己的post_path和post_url帮助来解决这个问题:

module PostsHelper
  def post_path(post,options={})
    post_url(post,options.merge(:only_path => true))
  end

  def post_url(post,options={})
    url_for(options.merge(:controller => 'posts',:action => 'show',:id => post.id,:slug => post.slug))
  end
end

这意味着我们终于可以使用:

link_to 'show',post

如果这一切似乎太多的工作,一个常见的替代方法是使用看起来更像帖子/:id-:slug的URL,在这种情况下,您可以坚持使用标准的RESTful路由,并且只需覆盖Post类中的to_param方法:

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

您还需要做一些工作,将params [:id]分解成一个ID和一个插件,然后才能在显示,编辑,更新和销毁控制器操作中查找相关实例.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读