RoR routes.rb - 全部为root?

时间:2014-03-29 20:09:18

标签: ruby-on-rails ruby ruby-on-rails-3

我正在学习RoR,我决定将我当前的网站(使用PHP / WP构建)复制到确切的功能(或尽我所能)。

我有一个Projects模型,每个都有自己的'show'页面。我还有一个Pages控制器,它将所有URL作为slug路由到root。即:/ test-page,/ about,/ contact

但是有没有办法我可以将项目slug指向“root”?所以它将是:/ project-name1,/ project-name2等而不是/ projects /:slug?

我是Ruby和RoR的新手,所以我觉得我可能错过了一些明显的东西。我现在唯一可以看到如何做到这一点的方法是编写一个控制器,根据一个段塞匹配系统为slug类型引入适当的控制器。因此,如果/页面在页面模型中匹配,则它使用该模板。否则,一个项目。

这似乎不对,我甚至不确定我是否可以直接控制这样的控制器?


来了w / this ..但似乎不完整?

include Rails.application.routes.url_helpers

class SiteController < ApplicationController
    attr_accessor :project, :page

    def show
        check = -> m { m.where(:title => params[:slug]).first }

        if (@project = check.call(Projects)).present?
            render 'projects/show'

        elsif (@page = check.call(Pages)).present?
            render 'pages/show'

        else
            raise ActionController::RoutingError.new 'Not Found'
        end
    end
end

2 个答案:

答案 0 :(得分:1)

您可以将根网址设置为project#show。像:

get '/:id' => 'product#view'

答案 1 :(得分:1)

所以你说你想在一个控制器中使用两个模型 - 就像'项目'和'页面'在路由方面实际上是一样的。你能告诉我为什么你这样做很重要吗?像imadesigner.com/portfolio/some-other-company-project这样的网址有什么问题?

如果你真的想在常规网站页面中混合项目,就URL方案而言,那么就有一些“解决方法”。当我开始使用RoR时,我也来自PHP。我最初在我的网址结构中使用了pidsid变量来描述页面结构,我将这种心态转移到了RoR上。它没有真正成功。就“静态”网站页面而言,将静态字符串映射到控制器/方法有什么问题?

即,

不要将其视为:imadesigner.com/:could_be_either_a_project_or_page,而是将路由显式写为:

get '/contact', to: 'site#contact'
get '/set-me-on-fire', to: 'site#burninate'
get '/:id', to: 'site#projects'

这样,您可以在项目slug匹配之前显式设置静态路由。对imadesigner.com/contact的任何请求都会发送到site#contact,对imagedesigner.com/set-me-on-fire的请求会发送到site#burninate,任何ELSE都会被视为搜索执行网站#project方法的项目。所以现在在您的项目方法中,您不需要确定请求是否正在搜索页面或项目;它总是在寻找一个项目。

所有这些都考虑到了,你仍然会遇到问题,因为你需要确保你的项目slug不会干扰常规页面slu ;;否则一个模型将优先于另一个模型,你将有一个无法访问的页面/项目。