前回の記事はこちら
ブログHeroku移転計画 その2 - 「Getting Started with Rails」をやってみた(2)

結構間が空いてしまったので、忘れてるなあ・・・。
けど、とりあえず終わらせるぞ。

■10.セキュリティ
次はセキュリティって書いてあったけど、Basic認証のかけ方。
すげー簡単。

@/app/controllers/application_controller.rb

class ApplicationController < ActionController::Base
protect_from_forgery

private

def authenticate
authenticate_or_request_with_http_basic do |user_name, password|
user_name == 'admin' && password == 'password'
end
end end

authenticateってアクションを追加。
privateってのはメソッドの呼び出せるスコープかな。
なんか本で読んだ気がするぞ。

@/app/controllers/posts_controller.rb
+ before_filter :authenticate, :except => [:index, :show]

Postsコントローラーは参照系以外は全部認証が必要に。

@/app/controllers/comments_controller.rb
+ before_filter :authenticate, :only => :destroy

Commentsコントローラーは削除だけ認証をかける。
before_filterはフックを設定するためのメソッドだろうな。
最初がメソッド名で、次が引数って感じかな?
これはコントローラー部分のヘルプを見ればわかりそうだ。
この辺もCakePHPと似ている。

っつうことで、結構簡単に実装できた。
usersコントローラ作って・・・って奴もどこかでみとないとな。
まあ、個人利用のブログにいらんけど。


■11.マルチモデルフォームの作成
次はマルチモデルフォーム?
タグ機能を追加する方法っぽいな、助かるぜ。

書かれているままデータベースの作成など。
$ rails generate model tag name:string post:references
$ rake db:migrate


@/app/controllers/posts_controller.rb

+ has_many :tags

+ accepts_nested_attributes_for :tags, :allow_destroy => :true, + :reject_if => proc { |attrs| attrs.all? { |k, v| v.blank? } }

Postsコントローラを編集。
これが全くわからないので、調べてみた。
これはモデルが親子関係の時とか、子どもも一緒に更新するか?そん時は削除も許可するか、どんな時は拒否するか?みたいな設定ができるっぽい。

んで、Viewも変更しろだと。
まずはフォーム部分。
@ /app/views/posts/_form.html.erb


<%= post_form.label :content %>

<%= post_form.text_area :content %>

+

Tags


+ <%= render :partial => 'tags/form',
+ :locals => {:form => post_form} %>

<%= post_form.submit %>

これは単純にタグを入力する部分の追加って事なんだろうな。

んで呼び出しているパーツを生成。
@ /app/views/tags/_form.html.erb

<%= form.fields_for :tags do |tag_form| %>

<%= tag_form.label :name, 'Tag:' %>
<%= tag_form.text_field :name %>

<% unless tag_form.object.nil? || tag_form.object.new_record? %>

<%= tag_form.label :_destroy, 'Remove:' %>
<%= tag_form.check_box :_destroy %>

<% end %> <% end

もはや何が何だか。
意味はなんとなくわかるんだけどねえ。
どの変数にどんなオブジェクトが入っているかってのが、もはや追えないな。
tagsってフィールドの中にlabelとかtext_fieldとかがあるってのがまだよくわかってないな。
ま、そりゃいきなりわかったら怖いけど。


showのテンプレートにも追加
  

<%= notice %>




Content:
<%= @post.content %>



+


+ Tags:
+ <%= @post.tags.map { |t| t.name }.join(", ") %>
+



Comments


<%= render :partial => "comments/comment", :collection => @post.comments %>

joinして表示しているなあ。
なんかmapしてjoinしているのが美しくないらしいので、ヘルパーの登場っぽい。


■12.ヘルパー
@ /app/helpers/posts_helper.rb

module PostsHelper
+ def join_tags(post)
+ post.tags.map { |t| t.name }.join(", ")
+ end end

ヘルパーはモジュールでつくるんだなー。


@ /app/view/posts_helper.rb


Tags:
- <%= @post.tags.map { |t| t.name }.join(", ") %>
+ <%= join_tags(@post) %>


ヘルパーを呼び出した意識はないんだけど、スコープはどうなっているんだ?


んで、とりあえず終了。


■全体的な感想
CakePHP様様って感じで、確かによく似ていると思う。
あとは細かい、裏側で何が行われているのかをちょっと把握しながらやらないと、こんがらがっちゃうなあとは思った。

あとは公式サイトの使い方覚えないと(まず英語を怖がらないようにしないと)
このブログは現在、以下のような環境で動いている。

■現在
サーバ:さくらのレンタルサーバ
言語:PHP
フレームワーク:CakePHP データベース:MySQL


けど、主に経済的な理由から以下のような環境に移行したい。

■目標
サーバ:Heroku
言語:もちRuby
フレームワーク:Rails データベース:PostgreSQL


単にサーバ代をけちりたいだけです。
めざせ!無料でブログサイト!

ということで無料のPaaSを探していたら、Google App Engineの他にHerokuに無料プランの存在を確認。
無料プランだとデータベースが5MBしか使えないらしいんだけど、今の僕のサイトが2MBも無いので、当分いいだろうと。
最近ブログも書く回数減っているしねえ。

ということで、作業を当たるに当たって備忘録を書いておこうと思う。
ここいらで自分の前提条件を書いておく。

■自分のスキル
・Ruby「楽しいRuby」で楽しい気になっているだけで、ほとんどコードを書いたことがない
・Rails初めて
・Sinatoraは簡単だと聞いてちょこっとだけ触ったことがある ・フレームワークはCakePHPよく使っている


まあ、いろいろ壁がありそうだけど、なんとかなるっしょ。
ということで初めてみる。


■はじめてRailsに触る
つうことで、HerokuでRailsが動くらしいので、まずはRailsに慣れようと思う。
Sinatraの方がさくっと出来そうだけど、いい加減

「ん?なに?フレームワーク?Railsでいいんじゃない?やっぱアレだし」
って言いたいんです、すんません。

んで、Railsのチュートリアルやろうと思ったら日本語サイトがないじゃないかー。
Getting Started with Rails

こんな有名なアプリなのに無いってところがRubyの文化なのかしら。
ま、英語は読めませんがコードは読めるのでなんとかなるだろってことで前向きに進んでみる。

とりあえずrvmでさくっと環境を作る。
rvmについてはいろんなところで説明されているので、今回はパス。
あ、でも後日それはそれでまとめておこう。

■3 新しくRailsプロジェクトを作る
で、railsインストール。
$ gem install rails
$ gem install sqlite3-ruby $ gem install pg

個人的にはsqliteで良いんだけど、HerokuがPostgresなので環境を合わせとこうかなとPostgresのパッケージもインストール。
なんかデプロイする時にデータベース変更できるみたいなんだけど
(そこがすげーよ、びっくりだよ)
どれがPostgres用のアダプタとして最適なのかがわからないので、ようわからんかった。
けど、pgで良いらしい、多分。

んで、アプリを作る。
$ rails new blog

言われるがまま以下のコマンドを叩く。
$ bundle install

どうやらこれで必要なgemsパッケージをインストールしてくれるくさい。
で、何が必要かは
/Gemfile

で指定するっぽ。

次にデータベースの設定だ。
ここで試しにPostgresを指定してみる。
@/config/databese.yml

development:
adapter: postgresql
encoding: unicode
database: development
pool: 5
username: postgres password: postgres


続けてデータベースの作成。
$ rake db:create


pgパッケージがないぞ糞野郎!とか言われる。
んでいろいろ調べたらインストールしただけでは読み込まれないらしい。
で、どうするかというと以下のようにしたらOKだった。
@ /Gemfile
gem 'pg', :require => 'pg'

ふむ、Gemfileの存在意義を理解した。
なるほど。

これみてbundkeコマンドも動いているんじゃないかな?
依存パッケージが一箇所に集まっているのはいいね。
んで、再度db:createでデータベースがちゃんと出来ているのを確認。
どこかでRailsは環境ごとにデータベースを作成するって言ってたけど、
development_blog

って出来ていたので納得。

■4 こんにちわ、Rails
さて、いよいよHello,Railsだ。
PHPではフレームワークにWEBサーバまでくっついて来るってのは見たことがないんだけど、Rubyはそういうのばかりなんだよね。
Sinatraの時もそうだったし。
最初は
「なんだよ、めんどくせー」
って思っていたけども、わざわざWEBサーバの設定を気にせずにどこのディレクトリでも開発できるってのは確かにお手軽だわ。

んで、フレームワークに付属しているWebサーバで動かそうとすると大体
localhost:xxx

みたいなアドレスになるんだけど、実は私、VMWare上で開発しているんで、普通にやってもまず見られないことが多々。
ま、指定できるオプションあるだろうと調べたらやっぱりあった。
さすがだわー。
IPで指定するみたい。
$ rails server -b 192.168.xxx.xxx

これで
http:://192.168.xxx.xxx:3000

でアクセスしたらちゃんとみれた。
うむ、良いではないか。

が、すげー重いのな。
検索したらMongrelを使えばいいんじゃね?ってことなんで、言われた通りやってみる。
$ gem install mongrel

エラーが出た。
ERROR:  Error installing mongrel:
        ERROR: Failed to build gem native extension.

これどこかでみたことあるなあ。
多分rvm特有の問題だと思われる。
で、最新版を入れたらできた。
$ gem install mongrel --pre

--preをつけると最新版(非安定版)を入れれるみたい。
んで、Gemfileにも追加
@/Gemfile
+ gem 'mongrel'

これでサーバを再起動。
$  rails server -b 192.168.xxx.xxx
=> Booting Mongrel
=> Rails 3.0.5 application starting in development on http://192.168.xxx.xxx:3000
=> Call with -d to detach => Ctrl-C to shutdown server

おー、Mongrelが起動したっぽい。
で、アクセスしてみたら、すげーはえー。
これば良い!
とりあえずはこれでいこう。
つか、なんだこの差は・・・。


んで、コントローラ作るっぽい。
$ rails generate controller home index

いろいろ出来た。
そして、構成がCakePHPそっくりでビックリする。
理解しやすくて助かるわー。

試しにViewを編集してみる。
@/app/views/home/index.erb

- Hello, Rails! + Hello, Rails! longkey1

んで、アクセス。
http:://192.168.xxx.xxx:3000/home/index


お、ちゃんと変わってる。
いちいちサーバは再起動しなくてもいいっぽい。
ふむふむ。

んで、今までの静的なindex.htmlを削除するらしい。
$ rm public/index.html

で、/でアクセスしてきた場合をhomeコントローラのindexメソッドに紐付ける。
@/config/routes.rb

Blog::Application.routes.draw do

#...
# You can have the root of your site routed with "root"
# just remember to delete public/index.html.
root :to => "home#index"

rootっていうのは特別なんだろうか。
ま、多分そうだろ。

長くなったので、とりあえずここまで。
ブログHeroku移転計画 その2 - 「Getting Started with Rails」をやってみた(2)へ続く。
前回の記事はこちら
ブログHeroku移転計画 その1 - 「Getting Started with Rails」をやってみた(1)

Getting Started with Rails」の「5 Getting Up and Running Quickly with Scaffolding」から再開。

■5~6.scaffoldを作ったり、リソースを作ったり。
次はscaffoldか。
さて、本家はどこまで作ってくれるんだろう。
rails generate scaffold Post name:string title:string content:text
invoke active_record
create db/migrate/20110424014627_create_posts.rb
create app/models/post.rb
invoke test_unit
create test/unit/post_test.rb
create test/fixtures/posts.yml
route resources :posts
invoke scaffold_controller
create app/controllers/posts_controller.rb
invoke erb
create app/views/posts
create app/views/posts/index.html.erb
create app/views/posts/edit.html.erb
create app/views/posts/show.html.erb
create app/views/posts/new.html.erb
create app/views/posts/_form.html.erb
invoke test_unit
create test/functional/posts_controller_test.rb
invoke helper
create app/helpers/posts_helper.rb
invoke test_unit
create test/unit/helpers/posts_helper_test.rb
invoke stylesheets create public/stylesheets/scaffold.css

お、全部出来てるわw
凄いな、コントローラ、モデル、ビュー、テストまで一式だ。

次にデータベースの更新。
rake db:migrate

migrationってのがよくわかんないんだけど、すげ=便利そう。
CakePHPはこの辺弱かったし、似たようなことは出来るんだけど、そこまでみんな使ってない気がするな。
けどまあ、奥が深そうだ。

次、モデルのバリデーションか。
class Post < ActiveRecord::Base
validates :name, :presence => true
validates :title, :presence => true, :length => { :minimum => 5 } end

見た目で大体何やっているのかわかるのがすごいな。
presenceは未入力かどうかのチェックらしい。

なんかコンソールを使うとか書かれているので、そのまま入力。
$ rails console

んで、言われるがままに入力すると、同じ内容が帰ってきた。
>> p = Post.new(:content => "A new post")
=> # content: "A new post", created_at_at: nil,
updated_at: nil>
>> p.save
=> false
>> p.errors
=> #["can't be blank",
"is too short (minimum is 5 characters)"], :name=>["can't be blank"] }>

これすげー!
コンソール上でRails上のクラスとかメソッドが呼べるのかあ。
なんかいろいろ使えそうなんだけど、いまいち使い方が思いつかない・・・。

お、次はいよいよデータベースの内容を表示する一連の流れかな。
コントローラの中身を確認してみると、いろいろ出来てる。
んで、Viewもおんなじ様にいろいろ出来ている。

んで、レイアウトを変更するとな?
@/app/views/layouts/application.html.erb

- +

色つけただけ。
ブラウザで確認すると、確かに変わっている。
Railsだとデフォルトのレイアウトはapplication.html.erbって名前なのか。

んで、
記事の投稿、編集、削除、参照という一連のCRUDの流れの説明。
Viewファイル的には殆ど変わらない投稿と編集ページが、どうやってFormのアクション先を振り分けているかは良くわからなかった。
けど、Railsがうまく隠蔽してくれているといえばそうなのか。
これはちょっとでもルールから外れるとすげー面倒くさそうかも。

んで、ざーっと読み飛ばしてw「7 Adding a Second Model」へ
コメントのモデルを作るってことね。


■7.2個目のモデルを作る
$ rails generate model Comment commenter:string body:text post:references
$ rake db:migrate

post:referenceって書くだけで参照してくれるのか。
そういえばテーブルも作りもCakePHPとほぼ一緒だな。

postsモデルにも関連付けを追加。
has_manyだと。
@/app/models/post.rb
class Post < ActiveRecord::Base
validates :name, :presence => true
validates :title, :presence => true, :length => { :minimum => 5 }
+ has_many :comments end


次にroutes.rbに以下の項目を追加するらしいんだけど、これが全くさっぱりわからん。
後から分かってくるかな?
@/configroutes.rb

- resources :posts
+ resources :posts do
+ resources :comments + end

迷わず行けよ、行けばわかるさ。

コメントコントローラの生成ね。
$ rails generate controller Comments


んでポストのshowビューに以下の様に変更。
コメントを投稿できるようにするっぽい。
@/app/views/posts/show.html.erb

<%= notice %>




Name:
<%= @post.name %>




Title:
<%= @post.title %>




Content:
<%= @post.content %>



Add a comment:


<%= form_for([@post, @post.comments.build]) do |f| %>

<%= f.label :commenter %>

<%= f.text_field :commenter %>


<%= f.label :body %>

<%= f.text_area :body %>


<%= f.submit %>

<% end %>

<%= link_to 'Edit Post', edit_post_path(@post) %> | <%= link_to 'Back to Posts', posts_path %> |

この中で
<%= form_for([@post, @post.comments.build]) do |f| %>

がよくわかんないけど、これでよろしくやってくれているんだろう。

んで、コメントコントローラーにもメソッド追加
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.create(params[:comment])
redirect_to post_path(@post) end

createメソッドがpostコントローラから始まっているところがみそっぽいな。

実際にフォームから送信しようとすると
/posts/2/comments

みたいなURLになっているので、大したものだなあ。
この辺はちょっとどこかで解説みないとわかんないな。

んで、再度showビューを編集して、コメントの一覧が見えるようにする。
+ 

Comments


+ <% @post.comments.each do |comment| %>
+


+ Commenter:
+ <%= comment.commenter %>
+


+
+


+ Comment:
+ <%= comment.body %>
+

+ <% end %>

なんだかよくわからないことが増えてきた。
先ほどroutes.rbに追加したのは、どうやら
/posts/1/comments/1

みたいなルーティングを実現したい時に使うっぽい。
あとフォーム周りはようわからんな。
これ実際に自分でつくろうとすると、必ず躓くな。
が、ひとまず前に進もう。

■8.リファクタリング
次はリファクタリング。
まさかのリファクタリング指南コーナーか。

まずはパーツ作り。
@/app/views/comments/_comment


Commenter:
<%= comment.commenter %>




Comment:
<%= comment.body %>



@/app/views/comments/_form.html.erb

<%= form_for([@post, @post.comments.build]) do |f| %>

<%= f.label :commenter %>

<%= f.text_field :commenter %>


<%= f.label :body %>

<%= f.text_area :body %>


<%= f.submit %>
<% end


次に読み込む先をごにょる。
@/app/views/posts/show.html.erb

<%= notice %>




Name:
<%= @post.name %>




Title:
<%= @post.title %>




Content:
<%= @post.content %>



Comments


<%= render :partial => "comments/comment",
:collection => @post.comments %>

Add a comment:


<%= render "comments/form" %>




<%= link_to 'Edit Post', edit_post_path(@post) %> | <%= link_to 'Back to Posts', posts_path %>

ポイントは
<%= render :partial => "comments/comment",
:collection => @post.comments %>
<%= render "comments/form" %>

の2箇所。

やっていることは大体わかる。
ただ、collectionって指定すると、中でループを展開してくれるっぽい。
あとは、form_forメソッドで、指定しているのは、関連付けされているモデルの場合の指定方法みたいだ。
buildってメソッドもその一環らしい。
それぞれモデルクラス、formヘルパークラスの説明部分にそれっぽいことが書いてあった。
けど、英語か・・・。
細かい部分は自信ないな。
けど、この辺のヘルパーやモデルの関係もCakePHPと似ている。
より強力な感じだけども。

■9.コメントの削除
次は削除処理か。
@/app/views/comments/_comment.html.erb

+


+ <%= link_to 'Destroy Comment', [comment.post, comment],
+ :confirm => 'Are you sure?',
+ :method => :delete %> +


link_toはURLヘルパーかな?
もはや何ヘルパーに属しているかさえも分からんくなっているな。
comment.postでそれぞれ:comment.post_idや:idをどうやら指定しているのかな?
んー。
ちと分かりづらいな。
次のコントローラ部分へのメソッドの追加をみるとそんな感じなんだけど。
@/app/controllers/comments_controller.rb

+ def destroy
+ @post = Post.find(params[:post_id])
+ @comment = @post.comments.find(params[:id])
+ @comment.destroy
+ redirect_to post_path(@post) + end


んで、記事が消されたらコメントも消そうというのが以下の設定。
ふむふむ。
@/app/models/post.rb

class Post < ActiveRecord::Base
validates :name, :presence => true
validates :title, :presence => true, :length => { :minimum => 5 }
+ has_many :comments, :dependent => :destroy end

dependentってのは分かりやすいわ。


長くなったので今回もここまで。
続きます。
ブログHeroku移転計画 その3 - 「Getting Started with Rails」をやってみた(3)
第3回勉強会@Ruby東海に参加して来ました。

■(J)RubyとDSLについて(前田さん

・DSLとRubyってのは良く結び付けられる話題ではあるんだけど、DSLとはってところからのじっくりとした説明を受けたのは始めてな気がする
・DSL自体の定義ってのは、結構曖昧なんだな
・JRubyの最初の起動時の遅さがなんとかならないのか→最初から起動しておくとかいろんな意見が出てた
・自分でコンパイラを作って・・・とかは、はっきり言って凄いなと
・英語の資料を見て、Rubyってインターナショナルなんだと実感
・大学の先生らしく、視点がアカデミックだなーと
graphvizというソフトがフローとか書く時に便利くさい

■ActiveSupportを読む(かたぎりさん)

・今日は第0回みたいな感じで、イントロダクションで終った
・読書会みたいな形式でやるかも=未定
・42という数字はギークにとって大切、これだけは覚えて帰るべし
・Rails知らないと面白さ半減な気がするので、触ってからやりたい
・かたぎりさんはどんどんプレゼンが上手くなっている気がしてにくい

最初に全員で自己紹介、その後発表。
時間が2時間弱ということで、あっという間に終った。
フランクな感じで進んでいく雰囲気は素敵で、発表者と聴いている人達の距離が近い感じがした


懇親会では、前田さんの大学の話とか、なぜか流行っている風のマラソンの話とかで盛り上がった。
けど、良く見るメンツが固定化されて来ている気もするので、もっと人の出入りがあっても良いのかなと。
KPTをやったりポジションペーパーを作ったりといろいろ新しいことにチャレンジしているので、これから楽しみな勉強会だなー。

頑張ってみんなについていけるように頑張りたいな。
名古屋Ruby会議01 - Regional RubyKaigi
一応スタッフとして参加させて頂きましたが、大した仕事も出来ずなんだか申し訳ない感じでした。
イベント自体は大成功だったと思います。

ざっくり感想

□セクションA
■Railsによる多言語ECサイト事例紹介
最首さんの発表は2回目。
ドタバタしていて、あまり覚えていない感じ。
けど、2月頃に行われた時の方が「人生」が語られていて、個人的には印象的でした。
Amazon EC2が重要ってのは、前回と一緒ですかね。

■Rubyで実践!MapReduce
ゲームの印象しかありません。
ちささんは、なんだか毎回型にはまらない発表をする方だなあという印象。
会場がゲームに一斉に参加していた様子は、ちょっと異様でした。
不思議な光景。

■製造業向け3Dデータ変換ソリューションにおけるRuby活用事例
とっても面白い方でした。
若い人のモチベーションを引き出すのが上手い良い会社なんだろうなと思いました。
Rubyのこういう間接的な使われ方は、今後増えそう。

■昼食
ちかくの鮪屋さんであぶり丼を頂きました。
うまかったー。

□セクションB
■Rubyのメモリ管理の改善
Ruby界隈では有名な笹田さんのお話。
最終的には会場の中で3人ぐらいしか理解できない話をしますと言いつつ、極力分かりやすく説明されていたのが印象的。
けど、よく歩き回りながら発表する個性的な人でした。
この話を面白いと思えた人は、このイベントを楽しめた気がします。

■Agile Web Development with Rails and Cucumber
Cucumberは非常に面白いソフトでした。
テストケースを日本語で書けるってのが凄いなあ。
非常に丁寧な説明で素敵な人でした。

□セクションC
■Rubyでライフハッキング10連発♪
タイトルとやった内容が違いました(笑)
Ruby 1.9の簡単な説明?

■RubyとメタプログラミングとDSL
メタプログラミングやDSLという言葉をキーワードにRubyの柔軟な側面の説明という感じ。
Rubyのこの柔軟性っていうのは、諸刃の剣な気がしますけどね。
扱いに注意。

■プログラマとプログラマでない人のための課題管理ツール『Redmine』
Redmineが結構使われていることにびっくり。
一番会場からの質問が多かった気がします。
身近な話題ってことだったのかな?

■C4 (60分) LT & コミュニティアピール
最近勉強会等に参加するようになったので、結構見慣れた人達の見慣れた発表が続きました。
皆さん元気そうでした。


□中の人?な感想
・スポンサーとかお金周りが大変(人脈って大切)
・名古屋ではRubyをウリにしている企業がまだまだ少ない印象
・Ruby独特の雰囲気がある
・あんまり手伝えなかったので申し訳ない感じ=名前が最後までわからない人もいて、ちょっと寂しい
・Ustreamとかノウハウ無し、ドタバタ
・会場でネットワークや電源が使えたような感じだったので、事前に告知とか出来ればよかったかも
(発表者とスタッフだけ使ってOKっていってたので、制限があったかも)
・懇親会会場のキャパが足りなかった
・正直、短期間でよくここまで出来たと思った、(主要スタッフの皆さん凄い)
・1回目から結構な規模で結構なクオリティで出来てしまったので、次回から大変そう
・初心者には辛い内容が多かった(PHPカンファレンスでもそうだったかもしれん)

個人的には、いろいろ考えさせられる一日だったなー。
僕みたいな非常にライトなエンジニアが集まれるような場ってないのかな?ってふと思った。
ちょっといろんな勉強会に参加して探してみようかな。

ちょっと曲がり角かも。
んー。

 

© Company 2012