简体   繁体   中英

How do I create a user-defined redirect in ruby on rails?

I have created a model called LandingPage, and the current route is something like:

www.domain.com/landing_pages/1

Or something like that. I will have several of these, so landing_page where id = 1...n.

However, when someone creates the landing page, I would like them to be able to define an attribute for the model, such as "superbowl" to redirect to landing_page/1, "nice" to landing_page/2, etc.

This would allow the user to define the landing page as:

subdomian.domain.com/superbowl 

which would resolve to

www.domain.com/landing_pages/1/

How do I do that? Each landing_page has an attribute 'shortname' which ties to its specific landing_page.

I am on Rails 2.3.8. My hunch is in the routes to loop through the available shortnames, but not sure.

 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

Taking your comments into account, you need a RedirectsController, and in your routes.rb file, you would have:

map.connect '/:name', :controller => 'redirects', :action => 'show'

You need to make sure that this route comes after your resource routes. In your RedirectsController, the show method would be something like:

def show
  @landing_page = LandingPage.first(:conditions => {:name => params[:name]})
  redirect_to @landing_page
end

I'm not sure what you're trying to achieve at www.domain.com/landing_pages/1/, but using your code as an example, you should have the following in your LandingPagesController show action:

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

However, this solution is not as good as before because, unless I am missing it, I do not know that you can constrain a route to a subdomain in 2.3.8. Without constraining to subdomains, you would have to make sure your users did not use one of your controllers' names as a landing page word, adding complexity to your program.

There is a plugin, called subdomain-fu, which should allow you to restrict your routes to a subdomain. The project is located at https://github.com/mbleigh/subdomain-fu . I hope this helps, if not let me know.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM