我创建了一个名为 LandingPage 的模型,当前的路线是这样的:
www.domain.com/landing_pages/1
或者类似的东西。我会有几个这样的,所以 landing_page where id = 1...n。
但是,当有人创建着陆页时,我希望他们能够为模型定义一个属性,例如“superbowl”重定向到 landing_page/1,“nice”重定向到 landing_page/2 等。
这将允许用户将着陆页定义为:
subdomian.domain.com/superbowl
这将解析为
www.domain.com/landing_pages/1/
我该怎么做?每个 landing_page 都有一个属性“shortname”,该属性与其特定的 landing_page 相关联。
我使用的是 Rails 2.3.8。我的直觉是在路由中循环遍历可用的短名称,但不确定。
8 def show
9
10 @landing_page = LandingPage.where(:name => params[:name]).first
11 redirect_to landing_page_path(@landing_page)
12
13 #@landing_page = LandingPage.find(params[:id])
14 @redcloth_landing_page = RedCloth.new(@landing_page.message).to_html
15 form = "<div id='form'>" << @landing_page.form << "</div>"
16
17 @redcloth_landing_page.gsub!("{Form}",form)
18
19 render :layout => false
20 end
最佳答案
考虑到您的意见,您需要一个 RedirectsController,并且在您的 routes.rb 文件中,您将拥有:
map.connect '/:name', :controller => 'redirects', :action => 'show'
您需要确保此路由出现在您的资源路由之后。在您的 RedirectsController 中,show 方法类似于:
def show
@landing_page = LandingPage.first(:conditions => {:name => params[:name]})
redirect_to @landing_page
end
我不确定您在 www.domain.com/landing_pages/1/上想要实现什么,但以您的代码为例,您的 LandingPagesController show 操作中应该包含以下内容:
def show
@landing_page = LandingPage.find(params[:id])
@redcloth_landing_page = RedCloth.new(@landing_page.message).to_html
form = "<div id='form'>" << @landing_page.form << "</div>"
@redcloth_landing_page.gsub!("{Form}",form)
render :layout => false
end
但是,这个解决方案不如以前好,因为除非我遗漏了它,否则我不知道您可以在 2.3.8 中限制到子域的路由。在不限制子域的情况下,您必须确保您的用户没有使用您的 Controller 名称之一作为登陆页面词,从而增加程序的复杂性。
有一个名为 subdomain-fu 的插件,它应该允许您将路由限制到子域。该项目位于https://github.com/mbleigh/subdomain-fu .我希望这会有所帮助,如果没有请告诉我。
关于ruby-on-rails - 如何在 ruby on rails 中创建用户定义的重定向?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5228261/