Ruby on rails RoR routes.rb-全部到根目录?

Ruby on rails RoR routes.rb-全部到根目录?,ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,我正在学习RoR,我已经决定复制我当前的站点(使用PHP/WP构建)以获得确切的功能(或者尽我所能做到最好) 我有一个项目模型,每个项目都有自己的“展示”页面。我还有一个页面控制器,它将所有URL作为slug路由到root。ie:/test page,/about,/contact 但是,有没有一种方法可以让我将项目slug指向“root”?所以应该是:/project-name1、/project-name2等,而不是/projects/:slug 我是Ruby和RoR的新手,所以我觉得我可能

我正在学习RoR,我已经决定复制我当前的站点(使用PHP/WP构建)以获得确切的功能(或者尽我所能做到最好)

我有一个项目模型,每个项目都有自己的“展示”页面。我还有一个页面控制器,它将所有URL作为slug路由到root。ie:/test page,/about,/contact

但是,有没有一种方法可以让我将项目slug指向“root”?所以应该是:/project-name1、/project-name2等,而不是/projects/:slug

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

这似乎是错误的,我甚至不确定我是否能像那样指挥控制器


我想到了这个。。但它似乎不完整

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
包括Rails.application.routes.url\u帮助程序
类SiteController<应用程序控制器
属性访问器:项目,:第页
def秀
check=->m{m.where(:title=>params[:slug]).first}
如果(@project=check.call(Projects))。是否存在?
渲染“项目/显示”
elsif(@page=check.call(Pages))。是否存在?
呈现“页面/显示”
其他的
raise ActionController::RoutingError.new“未找到”
结束
结束
结束

您可以将根url设置为
project\show
。比如:

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

所以你是说你想在一个控制器中使用两个模型——就路由而言,“项目”和“页面”实际上是同一件事。你能告诉我为什么这样做很重要吗?像
imadesigner.com/portfolio/someothercompanyproject
这样的URL有什么问题

如果你真的想把项目和常规的网站页面混合在一起,那么就有一些“变通方法”。当我开始使用RoR时,我也来自PHP。我最初在URL结构中使用
pid
sid
变量来描述页面结构,我将这种心态带到了RoR中。这并没有真正起作用。就“静态”站点页面而言,将静态字符串映射到控制器/方法有什么不对

i、 e

与其将其视为:
imadesigner.com/:可以是\u项目\u或\u页面
,不如将路由明确地写为:

get '/contact', to: 'site#contact'
get '/set-me-on-fire', to: 'site#burninate'
get '/:id', to: 'site#projects'
通过这种方式,您可以在项目段塞匹配之前显式设置静态路由。对
imadesigner.com/contact
的任何请求都会发送到
site#contact
,对
imagedesigner.com/set me on fire
的请求都会发送到
site#burniate
,其他任何请求都会被视为对执行site#projects方法的项目的搜索。所以现在在projects方法中,您不需要确定请求是否正在搜索页面或项目;它总是在寻找一个项目


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

但这将覆盖将“页面”设置为root?是的,它会。你不能将多个操作映射到一个路由。这看起来真的不像Rails控制器应该是什么样子。那么,有没有其他方法来实现这一点呢?这样做很有效,只会使添加额外页面比我希望的要复杂一些。但我想就是这样。非常感谢。此外,你应该考虑在你的ReDIT帖子中给出的答案。您应该使控制器/方法与其用途保持离散。因此,您可以制作一个“StaticPagesController”,其中包含所有静态页面所需的方法,并且您可以将html模板存储在app/views/static\u pages/where.html.erb中,以便于管理,而不是将所有内容都存储在SiteController中。如果其中一个静态页面不仅仅显示文本的段落(即,它涉及模型),您可以将其移动到它自己的控制器中。