ホーム 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を作成するだけで増やせます。

記事を共有

最近人気な記事