如何将静态URL重定向到rails资源

时间:2015-05-20 18:43:05

标签: ruby-on-rails

我们正在将我们的网站迁移到rails,但希望/需要维护来自旧网站的URL,并希望设置一种方法将旧URL重定向到新的rails路由。旧URL的格式如下:

/event/something
/event/something-else

有没有办法设置一个基于/event的路由来获取后面的值(即“某事物”或“其他东西”),在数据库查找表中查找值,获取适当的资源ID(例如new_events.id),然后重定向到新的Rails网址,即/new_events/1

我试图做类似的事情:

get 'event/:url_value' => 'my_controller#lookup'

但无法弄清楚如何访问:url_value

的值

2 个答案:

答案 0 :(得分:3)

你已经到了一半。在控制器内部,您可以使用:url_value访问params[:url_value]参数。

通过对命名约定的一些假设,您得到的结果类似于:

def lookup
  @event = Event.find_by old_url_value: params[:url_value]
  redirect_to event_path(@event), :status => :moved_permanently
end

谁喜欢在网址中显示ID?你为什么不保留URI?在表格中保留url_value参数,写下show方法,如下所示:

def show
  @event = Event.find_by url_value: params[:id]
end

并将此方法添加到您的事件模型中:

def to_param
  url_value
end

您的路由文件将返回:

resources :events

有关详细信息,请参阅to_param以及此somewhat related SO question。根据我链接的同一问题,使用的好处是some sort of slug generating gem

答案 1 :(得分:0)

您只需通过params hash获取传递的新网址,然后重定向到新的事件网址:

#in your my_controller

def look_up
  url_value = params[:url_value]
  # look up in the db using url_value
  event = Event.find_by( name: url_value ) # this is dummy code, use you own query to look up in DB and get the related event
  # redirect
  redirect_to "/new_events/#{event.id}"
  # if you have route name like new_events_path, then you can use
  # redirect_to new_events_path(event)
end