我应该在开放www.domain.com/:id
时解释:id
是一个页面,然后使用
get ':id' => 'pages#show'
如果:id
是类别使用
get ':category' => 'categories#show'
抱歉我的英文
get ':page' => 'pages#show'
resources :categories, :path => '/' do
resources :posts, :path => '/'
end
答案 0 :(得分:1)
为什么不写这样的东西:
<强>的routes.rb 强>
get '/:category_id/:post_id', to: 'categories#post'
并在您的 categories_controller.rb
中def post
#params[:category_id] and params[:post_id] will contain the params from the url
end
答案 1 :(得分:1)
constraints
, routes
是可行的方法,但我会为您的问题提出一些不同的解决方案。
考虑创建自定义Constraint
对象,这些对象将查询数据库以检查是否存在Post
或Category
:
应用程序/ LIB / post_constraint.rb
class PostConstraint
def matches?(request)
Post.exists?(request[:id])
end
end
应用程序/ LIB / category_constraint.rb
class CategoryConstraint
def matches?(request)
Category.exists?(request[:id])
end
end
在 app / config / routes.rb
中get ":id" => "posts#show", constraints: PostConstraint.new
get ":id" => "categories#show", constraints: CategoryConstraint.new
你必须要注意这样一个事实:id
非常不适合这种比较,因为Post
首先被检查,如果有记录匹配,&#34 ;帖子#节目&#34;将被访问,CategoryConstraint
甚至被打扰。
有关详情,请查看documentation。
您应该考虑为这两个模型添加slug
,以便更准确地提供用户期望看到的内容。为此,请尝试gem friendly_id。
希望有所帮助!祝你好运!
答案 2 :(得分:0)
几个解决方案 如果您的帖子ID和类别ID遵循模式,则可以为路线添加约束
1)
获取&#39;:post_id&#39; =&GT; &#39;发布#show&#39;,:constraints =&gt; {:id =&gt; / [A-Z] \ d {5} /}
get&#39;:category_id&#39; =&GT; &#39;类别#show&#39;,:constraints =&gt; {:id =&gt; / [1-9] \ d {5} /}
2) 添加一个自定义方法,其中post_id / category_id路由指向,检查id是post id或category id,并基于该呈现页面