我们正在将我们的网站迁移到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
答案 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