チュートリアルをする。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
文字列の式展開
>a = "32" >"#{a}hoge" => "32hoge"
シングルクォート、ダブルクォート
シングルクォートでは式展開が起きない。バックスラッシュもそのまま入るのでエスケープいらない。
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
- attr_accessorはアクセサの定義(getter,setterが定義される、user.nameなどでget,setできる)
- @nameはオブジェクトのインスタンス変数
- 初期化のところでハッシュを引数にしているので
User.new(name: "Michael Hartl", email: "mhartl@example.com")
のようにできる。