路径控制器#show方法,如控制器#索引在Rails

时间:2018-02-13 09:02:09

标签: ruby-on-rails rails-routing high-voltage

大家好我是铁杆新手。很抱歉,如果我无法正确定义此问题。

我想要的是:

domain.com/posts/1-sample-post

像这样路由:

domain.com/1-sample-post

如何在rails路线中实现此目的?我已经尝试了将近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。

2 个答案:

答案 0 :(得分:1)

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

的内容
get '/:id', to: 'posts#show'

但是这是一个包罗万象的路由,如果没有定义其他路由,如果它被配置为在root上提供页面,那么它将捕获所有路由,也就是你的HighVoltage。您现在有两个全能:一个用于查找静态页面,另一个用于查找帖子。

在这种情况下的最佳解决方案,imho是使静态页面显式化(因为我假设不会有那么多?)

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 

当然我没有测试这段代码,但我认为这应该让你开始。您也可以重定向到post-controller,而不是对帖子进行渲染,这可能更容易(并且您将完全使用PostsController),但会添加重定向并更改网址。

在您的路由中,您必须编写

get '/:id', 'home#show'   

答案 1 :(得分:0)

routes.rb文件中:

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

假设posts是您的控制器而show是使用给定ID调用您文章的视图的操作。

OP OPMENT后编辑: as: :sample_post子句应创建一个可以sample_post_path调用的帮助器<%= link_to "Show", sample_post %>