その他
    ホーム技術発信DoRuby【Ruby】Railsを使用せずにRubyのCGIをRailsっぽくする【CGI/Apache】

    【Ruby】Railsを使用せずにRubyのCGIをRailsっぽくする【CGI/Apache】

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    「一部のページを動的に表示したいけどRailsを入れる程の規模ではない」というような場合に使える方法です。 普通のhtmlと共存できます。 ディレクトリは下記のような場合を想定しています。

    http.confの修正

    RubyのCGIが使えるようにhttp.confを変更します。 ここでは詳しくは書きません。

    1.htaccessを作成

    $ cd ドキュメントルート
    $ vim .htaccess
    =============
    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^/$ [OR]
    RewriteCond %{REQUEST_URI} ^/news/$ [OR]
      ・
      ・    CGI表示したいページを[OR]でつなげて記述していく
      ・
    RewriteCond %{REQUEST_URI} ^/news/pickup/$
    RewriteRule .* /routes.rb [L]
    =============
    

    2.routes.rbの作成

    $ which ruby
    ---rubyのディレクトリ---          ←メモ
    $ vim routes.rb
    =============
    #!---rubyのディレクトリ---
    
    begin
      require './model/application'
      require './controller/application_controller'
      LOAD_DIR = %w(model controller)
      LOAD_DIR.each do |dir|
        Dir.glob("./#{dir}/*.rb").each do |file|
          require file
        end
      end
    
      # コントローラ生成
      controller_name = Application.get_controller_and_action_name[:controller]
      action_name = Application.get_controller_and_action_name[:action] || 'index'
      @controller = Kernel.const_get([controller_name, '_controller'].join.split('_').map(&:capitalize).join).new
    
      # アクション呼び出し
      eval "@controller.#{action_name}”
    
      # view呼び出し
      @controller.render
    
    rescue Exception
      # 例外発生時404 Not Found
    
      puts 'Status: 404 Not Found\n'
      puts 'Content-Type: text/html\n\n'
      puts ''
      puts '404 Not Found'
      puts "ページは移動または削除されました。"
      puts "トップページへ”
    
      # エラーログに書き込み
      $stderr.puts "#{$!} (#{$!.class})"
      $stderr.puts $@.join("\n")
    end
    =============
    

    3. model view controlle のディレクトリ作成

    $ mkdir model
    $ mkdir view
    $ mkdir controller
    $ vim model/.htaccess
    =============
    Deny from all
    =============
    $ cp model/.htaccess controller
    $ cp model/.htaccess view
    

    4. Application モデルの作成

    $ vim model/application.rb
    =============
    class Application
      ROOT_CONTROLLER = :top
      DEFAULT_ACTION = :index
    
      class << self
        def get_controller_and_action_name
          url_split = ENV['REQUEST_URI'].split('/').delete_if{|element| element.empty? || element.match(/\?/) != nil}
          controller = url_split.first || ROOT_CONTROLLER
          action = url_split[1] || DEFAULT_ACTION
          {controller: controller, action: action}
        end
      end
    end
    =============
    

    5. Application コントローラの作成

    $ vim controller/application_controller.rb
    =============
    require 'erb'
    require "cgi"
    require "cgi/session"
    
    class ApplicationController
      attr_accessor :cgi, :session, :params, :controller, :action
    
      def initialize
        @cgi = CGI.new
        @params = @cgi.params
        @session = CGI::Session.new(@cgi)
        @render_once = true
        params_parse
        @controller = Application.get_controller_and_action_name[:controller]
        @action = Application.get_controller_and_action_name[:action]
      end
    
      def params_parse
        if @params != nil
          form_array = @params.map do |key, value|
            if value.size == 1 && value.kind_of?(Array)
              

    [key.to_sym, value.first]

    else

    [key.to_sym, value]

    end end.flatten(1) end @params = Hash[*form_array] end def redirect_to(url, status=”REDIRECT”) print @cgi.header( { “status” => status, “Location” => url }) end def render(viewfile=nil) if @render_once viewfile ||= “view/#{@controller}/#{@action}.html.erb” @cgi.out(){ ERB.new(File.read(viewfile).force_encoding(“utf-8”)).result(binding) } @render_once = false end end end =============

    6. CGIで表示したいコンテンツのviewの作成(ここではTOPページ)

    $ mkdir view/top 
    $ vim view/top/index.html.erb
    ==============
      ・
      ・
      ・
    <%= @access %> 回目のアクセスです
      ・
      ・
      ・
    ==============
    

    7. CGIで表示したいコンテンツのmodelの作成(ここではTOPページ)

    $ vim model/top.rb
    ==============
    class Top
      SESSION_KEY_ID = ’top'
    end
    ==============
    

    8. CGIで表示したいコンテンツのcontrollerの作成(ここではTOPページ)

    $ vim controller/top_controller.rb
    ==============
    require 'csv'
    require "time"
    
    class TopController < ApplicationController
      def index
        init_session
        @access = @session[Top::SESSION_KEY_ID][:access]
      end
    
      private
    
      def init_session
        @session[Top::SESSION_KEY_ID] ||= {}
        @session[Top::SESSION_KEY_ID][:access] ||= {}
      end
    end
    ==============
    

    これでTOPページヘアクセスするたびにと「XX 回目のアクセスです」がカウントされていくと思います。
    動的なページを増やしたいのあれば.htaccessに「/controller/action/」の形式で追記してviewmodelcontrollerを作成するだけで増やせます。