Rails将动态页面路由到友好的URL

时间:2013-04-20 20:02:28

标签: ruby-on-rails ruby routing routes

我有一个活动网站需要为列名生成新的网址:当用户在活动管理员中创建活动时定义的域名,http://www.re-work.co/:domains

我有事件模态和events_controller,视图是事件#show

在我的路线文件中我有

match '/:domains' => "events#show"
  resources :events

我的控制器有这个看起来像问题,但我不知道该怎么改为:

class EventsController < ApplicationController
def show
  @event = Event.where(:domains => request.base_url).first

  if @event.nil?
    @event = Event.first
  end
end

一系列佣金路线,因为所有其他路线都与admin

有关
$ rake routes

         root            /                                         events#show
       events GET        /events(.:format)                         events#index
              POST       /events(.:format)                         events#create
    new_event GET        /events/new(.:format)                     events#new
   edit_event GET        /events/:id/edit(.:format)                events#edit
        event GET        /events/:id(.:format)                     events#show
              PUT        /events/:id(.:format)                     events#update
              DELETE     /events/:id(.:format)                     events#destroy

所有这些网址'/ events / technology'或'/ events / cities'或'/ cities'或'/ technology'都是同一页面,我是Rails的新手并且已经阅读/观看了rails路由教程,但我可以弄明白了。有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

那是因为这一行:

match '/:domains' => "events#show"

在&#34; /&#34;之后匹配所有内容并将其指向events#show动作。这条线是没有必要的(你可以删除它),因为:

  resources :events

将生成事件控制器的所有默认路由。

修改

如果您正在尝试执行的操作,则捕获在/:domains操作中要使用的show传递的内容。然后,这些参数作为params哈希的一部分传播,例如:

Parameters: {"domains"=>"technology"}

您可以像params[:domains]一样访问它。在这种情况下,您可以保留第一行:

match '/:domains' => "events#show"
match '/events/:domains' => "events#show" # add this one

resources :events   # <- delete this one, this right now is kind of redundant for what you're trying to do

并更改以下代码:

  @event = Event.where(:domains => params[:domains] ).first