railsで遊ぼう action and template

まず、アプリケーションにLessonControllerを追加しましょう。

C:\rails\asa>rails g controller lesson
      create  app/controllers/lesson_controller.rb
      invoke  erb
      create    app/views/lesson
      invoke  test_unit
      create    test/controllers/lesson_controller_test.rb
      invoke  helper
      create    app/helpers/lesson_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/lesson.coffee
      invoke    scss
      create      app/assets/stylesheets/lesson.scss

続いて、ルートで、LessonControllerのアクションを呼び出せるようにします。
/app/config/routes.rb

Rails.application.routes.draw do
root 'top#index'
get "about" => "top#about", as: "about"
get "/lesson/:action(/:name)" => "lesson"
end

続いて、パラメーターの設定です。
/app/controllers/lesson_controller.rb

class LessonController < ApplicationController
	def step1
	render text: "hello, #{params[:name]}san"
end
end

ブラウザのパスをしたのいずれかにすると、
localhost:3000/lesson/step1/sato
localhost:3000/lesson/step1?name=sato
%e7%84%a1%e9%a1%8c

ま、phpのgetですね。

railsで遊ぼう routing

railsでは、リクエストされたurlのパスから特定のコントローラとアクションを選ぶことをroutingといいます。

では、早速アプリケーションにアクションを追加してみましょう。
/config/routes.rb

Rails.application.routes.draw do
root 'top#index'
get "about" => "top#about", as: "about"
end

topControllerにaboutのメソッドを追加します。
/app/controllers/top_controller.rb

class TopController < ApplicationController
  def index
  	@message = "Hello, rails"
  	@txtmessage = "what's up?"
  end

  def about
  end
end

viewのフォルダに、about.html.erbを作成し、htmlを書いていきます。
/app/views/top/about.html.erb

<% @page_title = "このサイトについて" %>
<h1><%= @page_title %></h1>

<p>morning gloryは、1999年に結成された草野球チームです。毎週土曜日の早朝に練習することから、morning gloryというチーム名になりました。主な活動拠点は、多摩川河川敷グラウンドです。</p>

localhostの/aboutを開くと表示されます。
%e7%84%a1%e9%a1%8c

実際の開発では、リソースベースのルーティングを使うことがほとんどです。

rubyで遊ぼう 継承とミックスイン

サブクラスを作成する場合は、「class サブクラス名 < 親クラス名」とします。また、superは親クラスの同名のメソッドを呼び出すものです。 早速見てみましょう。

class Robot
	def initialize(name)
		@name = name
		@x = @y = 0
	end

	def move(x, y)
		@x += x; @y += y
	end

	def to_s
		“#{@name}: #{@x},#{@y}”
	end
end

class FlyingRobot < Robot
	def initialize(name)
		super
		@z = 0
	end

	def move(x, y, z)
		super(x, y)
		@z += z
	end

	def to_s
		super + ",#{@z}"
	end
end

robo1 = Robot.new("ロボ1号")
puts robo1
robo1.move(10, 5)
puts robo1
robo2 = FlyingRobot.new("飛行ロボ")
puts robo2
robo2.move(5, 5, 30)
puts robo2
C:\rails>ruby test.rb
ロボ1号: 0,0
ロボ1号: 10,5
飛行ロボ: 0,0,0
飛行ロボ: 5,5,30

手間を省略できますね♪
その他に、モジュールというものがあります。クラスのように、メソッドを記述します。
クラスの中にモジュールを取り込むことをミックスインといいます。
しかし、モジュールは親クラスにはなれず、親クラスを持つこともできませんが、ミックスインはできます。rubyは単一継承のため、複数の親クラスを持つことはできませんが、複数のモジュールを取り込むことができます。

module Radar
	def distance_to(other)
		Math.sqrt((self.x - other.x) **2 + (self.y - other.y) ** 2)
	end
end

class Robot
	include Radar
	attr_accessor :name, :x, :y

	def initialize(name)
		@name = name
		@x = @y = 0
	end

	def move(x, y)
		@x += x; @y += y
	end
end

robo1 = Robot.new("ロボ1号")
robo2 = Robot.new("ロボ2号")
robo2.move(12, 35)
puts "距離は #{robo1.distance_to(robo2)}です。"
C:\rails>ruby test.rb
距離は 37.0です。

なるほどね~。

rubyで遊ぼう クラスメソッド

クラス自体に特定の機能を持たせるには、クラスメソッドを作ります。クラスメソッドは、クラス名.メソッド名 のように呼び出します。
railsでは、データベースのテーブル全体を対象にするメソッドをクラスメソッドとして用意しています。

それでは、例を見てみましょう。

class Robot
	def initialize(name, x, y)
		@name = name
		@x = x; @y = y
	end
	def to_s
		"#{@name}: #{@x},#{@y}"
	end

	def self.load(fname)
		robots = []
		File.open(fname, encoding: "utf-8") do |f|
			f.each_line do |line|
				cols = line.chomp.split(/\t/)
				robots << new(cols[0], cols[1].to_i, cols[2].to_i)
			end
		end
		robots
	end
end

robots = Robot.load("test.txt")
robots.each{|robo| puts robo }

test.txt

ロボ1号	83	14
ロボ2号	5	51
ロボ3号	78	66

コマンド

C:\rails>ruby test.rb
ロボ1号: 83,14
ロボ2号: 5,51
ロボ3号: 78,66

rubyで遊ぼう アクセサメソッド

オブジェクト内のデータにアクセスする際には、メソッドを書かなければなりません。

読み出し用のメソッド attr_reader
書き込み用のメソッド attr_writer

それでは、例を見てみましょう。

class Robot
	attr_reader :name
	attr_accessor :score

	def initialize(name)
		@name = name
		@x = @y = 0
		@score = 10
	end
end

robo1 = Robot.new("ロボ1号")
robo2 = Robot.new("ロボ2号")
robo2.score = 90
puts robo1.name, robo1.score
puts robo2.name, robo2.score
C:\rails>ruby test.rb
ロボ1号
10
ロボ2号
90

rubyで遊ぼう クラス

newメソッドを呼び出すと、インスタンス.initialize(name)が実行されます。

class Robot
	def initialize(name)
		@name = name
		@x = @y = 0
	end

	def move(x, y)
		@x += x; @y += y
	end

	def to_s
		"#{@name}: #{@x},#{@y}"
	end
end

robo1 = Robot.new("ロボ1号")
robo2 = Robot.new("ロボ2号")
puts robo1
robo2.move(10, 20)
puts robo2
C:\rails>ruby test.rb
ロボ1号: 0,0
ロボ2号: 10,20

おなじみメソッド制限です。
public:メソッドはどこからでも呼び出せる
private:同じクラス、サブクラス内のメソッドの中だけで呼び出せる

class Robot
	def initialize(name)
		@name = name
		@x = @y = 0
	end

	def move(x, y)
		@x += x; @y += y
		crash if @x < -100 || @x > 100 || @y < -100 || @y > 100
	end

	def to_s
		"#{@name}: #{@x},#{@y}"
	end

	private
	def crash
		puts "ズコーン!"
	end
end

robo1 = Robot.new("ロボ1号")
puts robo1
robo1.move(20, 20)
puts robo1
robo1.move(40, 40)
puts robo1
robo1.move(50, 20)
puts robo1
robo1.crash
C:\rails>ruby test.rb
ロボ1号: 0,0
ロボ1号: 20,20
ロボ1号: 60,60
ズコーン!
ロボ1号: 110,80
test.rb:30:in `
': private method `crash' called for # (NoMethodError)

railsで遊ぼう rails active support

標準ライブラリ集が付属しているので、requireメソッドを使います。

open-uriは、http/ftp に簡単にアクセスするためのクラスです。
例えば、東京都のソースを取得したい場合は、

require "open-uri"

open("http://www.metro.tokyo.jp/") do |f|
	f.each_line {|line| puts line }
end