2012-08-07 39 views
0

我想要做几个小时的事情,并且我坚持使用rails路线。Ruby on Rails自定义路由或如何在初始化控制器之前获取request.request_url

所以..这个想法是有一些更便于用户使用的网址,比如/类别为笔记本电脑和/笔记本电脑/ Apple-MacBook-Air-and-on-on。我也应该使用像/ MyDummyPage等简单页面的链接。

所以我的想法是获取request_url并检查我是否可以自己找到页面。但是,在定义路由之后,在调用控制器之前,似乎rails正在初始化这个请求类。

正如您所看到的,我被卡住了,无法为我的问题看到任何可能的解决方案。 如果有人能帮助我,我会很高兴。

预先感谢您。 一切顺利!

+0

你能发表一些代码吗?您的routes.rb文件将很好启动。 – JGrubb 2012-08-07 12:11:38

+0

我的路线是无用的。这是想法: 1)我将query_string传递给模型(URL映射器) 2)它返回控制器和动作 我找到了一种方法来做到这一点,通过简单地创建每个单一的可能性使用每个例如。对于每个类别我创建一个马赫 但是这种方式真的很慢,因为每次我点击链接时都会产生匹配。可能这不会发生在使用乘客的生产中,但我不能承担这种风险。 你有没有尝试过这样的事情? – 2012-08-07 15:34:40

+0

我不明白你为什么认为你的路线是无用的。您不应该循环遍历每个可能的类别来查找匹配,这就是路由文件的用途,类似于'get':路径文件中的category'=>'products#category''应该可以让您到达那里。问题是路由文件是从上到下读取的,因此当您想要更符合用户需求的标准URL或更少的标准URL进行匹配时,请牢记这一点。 – JGrubb 2012-08-07 17:32:54

回答

0

(修订整件事)

如果你想允许动态的匹配与正常宁静的行车路线,有几个选项 - (把它放在你的路由年底或者它会匹配一切)

match '*raw' => 'dynamic#show' 

而且在dynamic_controller.rb

def show 
    parts = params[:raw].split '/' 
    # do logic here to set all variables used in views 
    render @resource_or_page 
end 

你也可以使用输入的搜索功能和重定向到搜索的第一个结果。如果没有结果,则返回404。

def show 
    results = search_method_here params[:raw].sub('/', ' ') 
    if results.any? 
    redirect_to results.first   
    else 
    raise ActionController::RoutingError.new 'Not Found' 
    end 
end 

而且,宁静的路线内freindlier网址,试试这个:https://github.com/norman/friendly_id


我认为它必须认识到,人们一般不用手操作的URL,其不错的可读性但对于他们要清楚他们在做什么/去哪里,他们更重要。

为了回应您的评论,我认为您误导了路由。如果您制作了两条路线:category:page,则它们与完全相同的网址匹配,但其中一条将其存储在params[:category]中,另一个存储在params[:page]中。为了区分它,您需要具有不同数量的参数,比如:category/:product或命名空间,或者可能是指定路由路由到的MVC的安静路由。

+0

您的解决方案的问题是我无法将这个mach用于类别和页面。我想排除关键字和id,所以如果我都匹配':category(/:product)'并匹配':page',它将只加载页面或类别。 – 2012-08-07 15:39:04

+0

是否有可能执行搜索查询并执行我想要的控制器而无需重定向和切换url? – 2012-08-08 07:08:32

+0

好的答案再次编辑。我认为那就是你想要的吗? – AJcodez 2012-08-08 08:03:41