目次
この記事はアピリッツの技術ブログ「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を作成するだけで増やせます。