大家好我是铁杆新手。很抱歉,如果我无法正确定义此问题。
我想要的是:
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。
答案 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 %>
。