如何在rails上制作动态嵌套路由?

时间:2015-03-11 10:41:01

标签: ruby-on-rails ruby ruby-on-rails-4

我应该在开放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

3 个答案:

答案 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对象,这些对象将查询数据库以检查是否存在PostCategory

应用程序/ 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,并基于该呈现页面