Add reroute middleware hack
This commit is contained in:
		
							parent
							
								
									9f1ba2ae66
								
							
						
					
					
						commit
						314f6d5219
					
				| 
						 | 
				
			
			@ -1,21 +1,24 @@
 | 
			
		|||
class Admin::AnnouncementsController < ApplicationController
 | 
			
		||||
  
 | 
			
		||||
  before_filter :require_entry_name, :only => [:index, :new]
 | 
			
		||||
  
 | 
			
		||||
  layout "admin"
 | 
			
		||||
  
 | 
			
		||||
  def index
 | 
			
		||||
    @announcements = Announcement.all
 | 
			
		||||
    @announcements = Announcement.find(:all, :conditions => { :entry_name => params[:entry_name] })
 | 
			
		||||
 | 
			
		||||
    respond_to do |format|
 | 
			
		||||
      format.html # index.html.erb
 | 
			
		||||
      format.html
 | 
			
		||||
      format.xml  { render :xml => @announcements }
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def new
 | 
			
		||||
    @announcement = Announcement.new
 | 
			
		||||
    @announcement.entry_name = params[:entry_name]
 | 
			
		||||
    
 | 
			
		||||
    respond_to do |format|
 | 
			
		||||
      format.html # new.html.erb
 | 
			
		||||
      format.htm
 | 
			
		||||
      format.xml  { render :xml => @announcement }
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
class AnnouncementsController < ApplicationController
 | 
			
		||||
 | 
			
		||||
  def index
 | 
			
		||||
    @announcements = Announcement.all
 | 
			
		||||
    @announcements = Announcement.find(:all, :conditions => { :entry_name => params[:entry_name] })
 | 
			
		||||
 | 
			
		||||
    respond_to do |format|
 | 
			
		||||
      format.html {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,4 +31,9 @@ class ApplicationController < ActionController::Base
 | 
			
		|||
    I18n.locale = session[:locale] || I18n.default_locale
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
  def require_entry_name
 | 
			
		||||
    render :text => 'missing entry_name' if params[:entry_name].blank?
 | 
			
		||||
    return
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,10 +13,7 @@ class PagesController < ApplicationController
 | 
			
		|||
    @page = Page.find_by_name(params[:page_name])
 | 
			
		||||
    
 | 
			
		||||
    if @page && !@page.external_link.blank?
 | 
			
		||||
    #  redirect_to @page.external_link
 | 
			
		||||
    elsif @page && !@page.use_engine.blank?
 | 
			
		||||
      #model_class = Kernel.const_get( "Announcement" ) # page.use_engine
 | 
			
		||||
      redirect_to announcements_path
 | 
			
		||||
      redirect_to @page.external_link
 | 
			
		||||
    else
 | 
			
		||||
      render_liquid_page
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,11 +2,12 @@ class Announcement
 | 
			
		|||
  
 | 
			
		||||
   include MongoMapper::Document
 | 
			
		||||
   
 | 
			
		||||
   key :entry_name, String, :required => true, :index => true
 | 
			
		||||
   key_i18n :title, String
 | 
			
		||||
   key_i18n :content, String
 | 
			
		||||
   
 | 
			
		||||
   def to_liquid
 | 
			
		||||
     { "id" => self.id, "title" => self.title, "content" => self.content }
 | 
			
		||||
     { "entry_name" => self.entry_name, "id" => self.id.to_s, "title" => self.title, "content" => self.content }
 | 
			
		||||
   end
 | 
			
		||||
   
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -2,9 +2,7 @@ class Layout
 | 
			
		|||
   
 | 
			
		||||
   include MongoMapper::Document
 | 
			
		||||
   
 | 
			
		||||
   key :name, String
 | 
			
		||||
   key :name, String, :required => true, :index => true
 | 
			
		||||
   key_i18n :content, String
 | 
			
		||||
   
 | 
			
		||||
   validates_presence_of :name
 | 
			
		||||
   
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -1,42 +1,30 @@
 | 
			
		|||
class Page
 | 
			
		||||
   include MongoMapper::Document
 | 
			
		||||
  
 | 
			
		||||
   key :name, String
 | 
			
		||||
   key :parent_page_name, String
 | 
			
		||||
   key :name, String, :required => true, :index => true
 | 
			
		||||
   key :parent_page_name, String, :required => true, :index => true
 | 
			
		||||
 
 | 
			
		||||
   key_i18n :title, String
 | 
			
		||||
   key_i18n :title, String, :required => true
 | 
			
		||||
   key_i18n :content, String
 | 
			
		||||
    
 | 
			
		||||
   key :layout_id, String
 | 
			
		||||
   key :layout_name, String
 | 
			
		||||
   key :layout_name, String, :required => true
 | 
			
		||||
   key :external_link, String
 | 
			
		||||
   key :position, Integer
 | 
			
		||||
   key :is_published, Boolean
 | 
			
		||||
   key :position, Integer, :required => true
 | 
			
		||||
   key :is_published, Boolean, :required => true, :default => true, :index => true
 | 
			
		||||
   
 | 
			
		||||
   key :is_component, Boolean
 | 
			
		||||
   key :component_name, String
 | 
			
		||||
   
 | 
			
		||||
   belongs_to :layout
 | 
			
		||||
   
 | 
			
		||||
   validates_presence_of :name
 | 
			
		||||
   validates_presence_of :position
 | 
			
		||||
   
 | 
			
		||||
   before_save :setup_layout_id
 | 
			
		||||
   before_validation :setup_default_value
 | 
			
		||||
  
 | 
			
		||||
   def self.find_by_name(page_name)
 | 
			
		||||
     Page.find(:first, :conditions => { :name => page_name, :is_published => true })
 | 
			
		||||
   end
 | 
			
		||||
   
 | 
			
		||||
   protected
 | 
			
		||||
   def layout
 | 
			
		||||
     Layout.find_by_name(self.layout_name)
 | 
			
		||||
   end
 | 
			
		||||
    
 | 
			
		||||
   def setup_layout_id
 | 
			
		||||
     if self.layout_name.blank?
 | 
			
		||||
       self.layout_id = nil
 | 
			
		||||
     else
 | 
			
		||||
       self.layout_id = Layout.find_by_name( self.layout_name ).id
 | 
			
		||||
     end
 | 
			
		||||
   end
 | 
			
		||||
   protected
 | 
			
		||||
         
 | 
			
		||||
   def setup_default_value
 | 
			
		||||
     if self.position.blank?
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,9 +2,7 @@ class Snippet
 | 
			
		|||
  
 | 
			
		||||
   include MongoMapper::Document
 | 
			
		||||
  
 | 
			
		||||
   key :name, String
 | 
			
		||||
   key :name, String, :required => true, :index => true
 | 
			
		||||
   key_i18n :content, String
 | 
			
		||||
   
 | 
			
		||||
   validates_presence_of :name
 | 
			
		||||
   
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			@ -1,3 +1,5 @@
 | 
			
		|||
<%= f.hidden_field :entry_name %>
 | 
			
		||||
 | 
			
		||||
<p id="title_zh_tw_block">
 | 
			
		||||
<%= f.label "title_zh_tw", "Title (zh_tw)" %>
 | 
			
		||||
<%= f.text_field "title_zh_tw" %>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,4 +18,4 @@
 | 
			
		|||
 | 
			
		||||
<br />
 | 
			
		||||
 | 
			
		||||
<%= link_to 'New announcement', new_admin_announcement_path %>
 | 
			
		||||
<%= link_to 'New announcement', new_admin_announcement_path( :entry_name => params[:entry_name] ) %>
 | 
			
		||||
| 
						 | 
				
			
			@ -42,8 +42,8 @@
 | 
			
		|||
</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
    <%= f.label :is_component, "Is component" %>
 | 
			
		||||
<%= f.radio_button :is_component, true %>Yes <%= f.radio_button :is_component, false %> No
 | 
			
		||||
<%= f.label :component_name, "Component Name" %>
 | 
			
		||||
<%= f.text_field :component_name %>
 | 
			
		||||
</p>
 | 
			
		||||
 | 
			
		||||
<p>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,7 @@
 | 
			
		|||
          <li><%= link_to t(:page, :scope => :admin), admin_pages_path %></li>
 | 
			
		||||
          <li><%= link_to t(:snippet, :scope => :admin), admin_snippets_path %></li>
 | 
			
		||||
          <li><%= link_to t(:layout, :scope => :admin), admin_layouts_path %></li>
 | 
			
		||||
          <li><%= link_to t(:announcement, :scope => :admin), admin_announcements_path %></li>
 | 
			
		||||
          <li><%= link_to t(:announcement, :scope => :admin), admin_announcements_path( :entry_name => 'news' ) %></li>
 | 
			
		||||
     </ul>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,8 @@ Rails::Initializer.run do |config|
 | 
			
		|||
  # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
 | 
			
		||||
  config.i18n.default_locale = "zh_tw"
 | 
			
		||||
  
 | 
			
		||||
  config.middleware.use :RerouteMiddleware
 | 
			
		||||
  
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
#VALID_LOCALES = ["en", "zh_tw"]
 | 
			
		||||
| 
						 | 
				
			
			@ -49,7 +51,6 @@ VALID_LOCALES = ["en", "zh_tw"]
 | 
			
		|||
 | 
			
		||||
MongoMapper.database = "r4-#{Rails.env}"  
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
module MongoMapper::Document::ClassMethods
 | 
			
		||||
  
 | 
			
		||||
  def key_i18n(key, *options)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,25 @@
 | 
			
		|||
class RerouteMiddleware
 | 
			
		||||
  
 | 
			
		||||
  def initialize(app)
 | 
			
		||||
    @app = app
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def call(env)
 | 
			
		||||
  
 | 
			
		||||
    #Rails.logger.debug env.to_yaml
 | 
			
		||||
    return @app.call(env) if env['REQUEST_URI'] =~ /^\/admin/
 | 
			
		||||
      
 | 
			
		||||
    env['REQUEST_URI'] =~ /^\/([\w]*)/
 | 
			
		||||
    parsed_entry_name = $1
 | 
			
		||||
   
 | 
			
		||||
    entry = Page.find_by_name( parsed_entry_name )
 | 
			
		||||
    
 | 
			
		||||
    if entry && entry.component_name
 | 
			
		||||
      env['REQUEST_URI'] = env['REQUEST_URI'].sub!(parsed_entry_name, entry.component_name)
 | 
			
		||||
      env['QUERY_STRING'] = (env['QUERY_STRING'].blank?)? "entry_name=#{parsed_entry_name}" : "entry_name=#{parsed_entry_name}&#{env['QUERY_STRING']}"
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
    @app.call(env)
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
end
 | 
			
		||||
		Loading…
	
		Reference in New Issue