2

大家好,我是 Rails 新手。对不起,如果我不能正确定义这个问题。

我想要的是:

domain.com/posts/1-sample-post

像这样路由:

domain.com/1-sample-post

我如何在铁路路线中实现这一目标?我已经尝试搜索了将近 3 个小时。这在 PHP 框架中非常容易。我认为这在 Rails 中也很容易。

我忘了提到我在我的应用程序中为我的静态页面安装了 High_voltage gem。

做过这个:

#routes.rb
resources :posts
get '/:id' => 'posts#show'

现在我的 High_voltage 页面无法呈现。

更新解决方案:

所以这是我们在路线中所做的:

Rails.application.routes.draw do
  resources :authors
  constraints(lambda { |req| Author.exists?(slug: req.params["id"]) }) do
     get '/:id' => 'authors#show'
  end

  devise_for :users

  resources :posts
  constraints(lambda { |req| Post.exists?(slug: req.params["id"]) }) do
    get '/:id' => 'posts#show'
  end
end

请注意,仅使用存在很重要?在这里查询,因为它比其他方法非常快,所以它不会消​​耗太多的加载时间来呈现记录。

特别感谢下面提供了很多帮助的人。Nathanvda、rwold 和 Tai。

4

2 回答 2

1

所以另一个答案正确地提出了类似的建议

get '/:id', to: 'posts#show'

但这是一条包罗万象的路线,如果没有定义其他路线,这将捕获所有路线,也包括您的 HighVoltage,如果它被配置为在根目录上提供页面。您现在有两个通用功能:一个用于查找静态页面,另一个用于查找帖子。

在这种情况下,最好的解决方案是让静态页面明确(因为我假设不会有那么多?)

get '/about' => 'high_voltage/pages#show', id: 'about'
get '/:id' => 'posts#show'

如果您有很多页面,似乎最容易在不同的路线上显示高压?例如像

get '/pages/:id' => 'high_voltage/pages#show' 
get '/:id' => 'posts#show' 

在这两种情况下,由于我们使用显式路由,因此您必须禁用高压初始化器中的默认路由:

# config/initializers/high_voltage.rb
HighVoltage.configure do |config|
  config.routes = false
end

[更新:添加特殊控制器来考虑帖子和页面]

添加HomeController这样的:

class HomeController < ApplicationController

  # include the HighVoltage behaviour --which we will partly overwrite 
  include HighVoltage::StaticPage    

  def show
    # try to find a post first 
    @post = Post.where(id: params[:id).first 
    if @post.present? 
      render 'posts/show'
    else 
      # just do the high-voltage thing
      render(
        template: current_page,
        locals: { current_page: current_page },
      )
    end 
  end 
end 

当然我没有测试这段代码,但我认为这应该让你开始。除了渲染帖子,您还可以重定向到帖子控制器,这可能更容易(并且您将PostsController完全使用),但会添加重定向并更改 url。

在你的路由中,你将不得不写

get '/:id', 'home#show'   
于 2018-02-13T10:28:53.547 回答
0

在您的routes.rb文件中:

get '/:id-sample-post', to: 'posts#show', as: :sample_post

假设这posts是您的控制器,并且show是调用具有给定 ID 的文章的视图的操作。

OP 注释后编辑:该as: :sample_post子句应创建一个sample_post_path可以作为<%= link_to "Show", sample_post %>.

于 2018-02-13T09:42:10.073 回答