我正在学习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
答案 0 :(得分:1)
您可以将根网址设置为project#show
。像:
get '/:id' => 'product#view'
答案 1 :(得分:1)
所以你说你想在一个控制器中使用两个模型 - 就像'项目'和'页面'在路由方面实际上是一样的。你能告诉我为什么你这样做很重要吗?像imadesigner.com/portfolio/some-other-company-project
这样的网址有什么问题?
如果你真的想在常规网站页面中混合项目,就URL方案而言,那么就有一些“解决方法”。当我开始使用RoR时,我也来自PHP。我最初在我的网址结构中使用了pid
和sid
变量来描述页面结构,我将这种心态转移到了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 ;;否则一个模型将优先于另一个模型,你将有一个无法访问的页面/项目。