Rodhos Soft

備忘録を兼ねた技術的なメモです。Rofhos SoftではiOSアプリ開発を中心としてAndroid, Webサービス等の開発を承っております。まずはご相談下さい。

チュートリアルをする。Ruby編

以下のチュートリアルをやったのログである。

第4章 Rails風味のRuby | Rails チュートリアル

静的なページにrubyを埋め込むのは<% %>、出力させるのは<%= %>であった。
sample_appアプリケーション全体のレイアウトの元を見てみる。
app/views/layouts/application.html.erb

<!DOCTYPE html>
<html>
<head>
  <title>Ruby on Rails Tutorial Sample App | <%= yield(:title) %></title>
  <%= stylesheet_link_tag    "application", media: "all",
                                            "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

組み込み関数

ここで、stylesheet_link_tag、javascript_include_tag、csrf_meta_tagsは
Railsの組み込み関数である。(
ActionView::Helpers::AssetTagHelper
)

ruby的な技法として、カッコを使わない呼び出しが行われているので組み込み関数の次に書かれているものたちは引数である。
=>はハッシュである。あと混乱するが media:'all'もハッシュである。これは:mediaというシンボルをキーとしたハッシュでこのような書き方ができる。
つまり、:media => 'all'

<%= yield(:title) %>

これは各ビュー、例えば
app/views/static_pages/home.html.erb

<% provide(:title, 'Home') %>
<h1>Sample App</h1>
<p>
    This is the home page for the
    <a href="http://railstutorial.jp/">Ruby on Rails Tutorial</a>
    sample application.
</p>

で、provideとして、:titleに'home'を結びつけている。

練習

タイトルをもっと動的に変更する。そのためにfull_titleヘルパー関数を定義し、そこで表示を動かす。
その定義は
app/helpers/application_helper.rb
に書くものとする。

 # ページごとの完全なタイトルを返します。
  def full_title(page_title)
    base_title = "Ruby on Rails Tutorial Sample App"
    if page_title.empty?
      base_title
    else
      "#{base_title} | #{page_title}"
    end
  end

要するに引数のpage_titleが空だったなら、base_titleを表示し、そうでなければ、 "#{base_title} | #{page_title}"を表示する。

アプリレイアウト側を

<!DOCTYPE html>
<html>
<head>
  <title><%= full_title(yield(:title)) %></title>
  <%= stylesheet_link_tag    "application", media: "all",
                                            "data-turbolinks-track" => true %>
  <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
  <%= csrf_meta_tags %>
</head>
<body>

<%= yield %>

</body>
</html>

とすればOK。このようにヘルパーを定義して、埋め込み側はその関数をつかうとやるとシンプルに書ける。

railsコンソール

rails console

railsコンソールでrubyを対話的にいろいろ試せる。

文字列の式展開

>a = "32"
>"#{a}hoge"
=> "32hoge" 

シングルクォート、ダブルクォート

シングルクォートでは式展開が起きない。バックスラッシュもそのまま入るのでエスケープいらない。

rubyメソッド名の慣習 末尾の?はブールを返すという意味

"hoge".empty?
=> false

if の特殊な使い方

puts "hoge" if x>3 

もし、xが3以上ならhogew を表示するとなる。

メソッドの暗黙の戻り値

def func(string)
 if string.empty?
  "empty!"
 else
  "noempty"
 end
end

で、"empty!"や"noempty"が戻り値として返される。

範囲

(0..9).to_a

0から9までを配列に変換

 (0..3).each {|x| p x}

0から3までを表示

ハッシュ

b = {}
b["poi"] = 43
p b
> {"poi"=>43} 
b["poi"]
>43
b[:hoge] = 3423
> p b
 {"poi"=>43, :hoge=>3423} 
c = {:poge => 43}
d = {poge:43}

cとdは同じ意味である。

クラス

class World
 def hello()
   puts "Hello, world!"
  end
end
c = World.new
c.hello
>Hello, world!

練習

新規クラスUserを作成せよ。ファイル名はルートディレクトリにexample_user.rbとする。

class User
    attr_accessor :name, :email
    
    def initialize(attributes = {})
        @name  = attributes[:name]
        @email = attributes[:email]
    end
    
    def formatted_email
        "#{@name} <#{@email}>"
    end
end
  1. attr_accessorはアクセサの定義(getter,setterが定義される、user.nameなどでget,setできる)
  2. @nameはオブジェクトのインスタンス変数
  3. 初期化のところでハッシュを引数にしているので
 User.new(name: "Michael Hartl", email: "mhartl@example.com")

のようにできる。