2012年11月14日水曜日

17日目:Ruby勉強終了

Rubyも随分読めるようになったので、Rubyの勉強は終了です。
何か、作ってみましょうか。

2012年11月13日火曜日

16日目:Net::HTTP、超便利。

今日は軽めに。

require("net/http")
Net::HTTP.start("google.com") do |http|
  response = http.get("/")
  p response.body
end

他サービスアクセス、超楽ね。
さてそろそろRubyを使って何かアプリケーション作ろうかな。
勉強は一段落で、実践に入っていきます。


2012年11月12日月曜日

15日目:テストコードを見てみる。

Rubyと言えばTDDでしょ!(?)
ということで、今日は先日作成したRailsのScaffoldで作ったテストコードを見てみます。
test/functional/users_controller_test.rb
中を見ると、最初のメソッドはこんな感じ

  setup do
    @user = users(:one)
  end

setupはJUnitのsetupと一緒なんでしょう。ですが、ん?なに「:one」って?
調べたところ、これは
test/fixtures/users.yml
の中に用意されているテストデータを読み取ってるそうです。便利。
次のメソッドは以下、

  test "should get index" do
    get :index
    assert_response :success
    assert_not_nil assigns(:users)
  end

テストに説明(=should get index)を付けて、テストを実行しています。
indexにGetアクセスをして、レスポンスがsuccess(=200?)であることを確認しています。

assert_not_nil assigns(:users)
は、viewで、@usersがnullでないことを確認しているものです。例えば、controllerで@users変数に値を入れていることをテストしています。

その後にもたくさんのテストメソッドがありますね。

テストも簡単に書けるんですね。便利。


2012年11月11日日曜日

14日目:テスト、大事!

RailsのScaffoldを実行するとテストコードも一緒に出力されます。
Only in app2/Ins/test/fixtures: users.yml
Only in app2/Ins/test/functional: users_controller_test.rb
Only in app2/Ins/test/unit: helpers
Only in app2/Ins/test/unit: user_test.rb
今日はこのテストを勉強します。
users_controller_test.rbは「機能テスト」と言われるコードだそうです。
対して、user_test.rbは「単体テスト」と言われるコードだそうです。

まずはテストを実行します。
jruby test/functional/users_controller_test.rb 
LoadError: no such file to load -- test_helper
  require at org/jruby/RubyKernel.java:1019
  require at /Applications/jruby-1.7.0/lib/ruby/shared/rubygems/custom_require.rb:36
   (root) at test/functional/users_controller_test.rb:1

怒られる。。。調べてみると、-Itestパラメータをつけるらしい。
jruby -Itest test/functional/users_controller_test.rb 
Run options: 
# Running tests:
EEEEEEE
Finished tests in 0.243000s, 28.8066 tests/s, 0.0000 assertions/s.
  1) Error:
test_should_create_user(UsersControllerTest):
ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: query does not return ResultSet: PRAGMA table_info("users")
・・・・
一歩前進!しかしながら、テストがダメだって言われる。dbがないらしい。マイグレートしていないからか。
rake RAILS_ENV=test db:migrate 
jruby -Itest test/functional/users_controller_test.rb 
Run options: 
# Running tests:
.......
Finished tests in 0.915000s, 7.6503 tests/s, 10.9290 assertions/s.
7 tests, 10 assertions, 0 failures, 0 errors, 0 skips

成功!
今日はここまで、次回はテストコードを読んでいきます。

2012年11月10日土曜日

13日目:Viewを見る。

先日作った、Rails Scaffoldでできたものを確認してます。
今日はViewを確認します。
 ls app/view/users 
 _form.html.erb edit.html.erb index.html.erb new.html.erb show.html.erb 
erbとはembedded Rubyの略で、JSPみたいにファイルをかけます。

JSPと同じく、
<% %>
の中にRubyスクリプトを書けて、
<%= %>
で、値を出力できます。

便利そうなのが、Railsがerb中にかけるように用意しているビューヘルパーというメソッドたちです。
例えば、index.html.erbに書かれている
<%= link_to 'Show', user %>
は、link_toというビューヘルパーを使っていて、ブラウザには以下のように出力されます。
<a href="/users/2">Show</a>
htmlを出力する処理は、Railsに必要なビューヘルパーが用意されていないかを確認しながら実装したほうがよさそうですね。
ビューヘルパーは自分で作ることもできるので、綺麗に実装できそうです。
でも、記法はEL式のほうがエレガントかな。

erbファイルはコントローラで出力するerbファイルを指定できますが、指定しない場合は
view/コントローラ名/メソッド名.html.erb
が呼ばれます。

Railsではレイアウトファイルが用意されていて、デフォルトではすべてのerbファイルは
app/view/layouts/application.html.erb
に組み込まれてブラウザに出力されます。

_が頭につくerbファイルは部分ビューで、他のerbファイルに組み込まれます。_form.html.erbはnew.html.erbの
<%= render 'form' %>
で読み込まれています。

ビューヘルパー、素敵そう。

2012年11月9日金曜日

脇道にそれて。Xperia AXとVLの違い

ちょっと脇道にそれて、Xperia AXとVLのデザイン上の違いをご紹介。
Xperia AX/VLは、海外ではXperia Vと呼ばれるAndroidの日本バージョンで、AXはdocomo、VLはauから出ています。
同じXperia Vの日本バージョンなんですが、中に乗っているソフトウェアだけでなく、外見上もデザインが違います。
で、私見。

auのXperia VLのほうが、断然カッコいい。

ちょっとした違いなのに、かっこ良さは段違いです。
大きな違いを二点。
①AXには、ディスプレイ上部に要らないdocomo Xiロゴがある。VLはスッキリ。
AXは、docomoの広告をいつも見ながらスマフォを操作してるようなものです。あくまで私見ですが、あまり気持ちのいいものじゃないなぁ。
対してVLは、すっきりした見た目。とてもいいです!

②AXは下のほうに変なでっぱり。VLはスッキリ。
AXはカクカクっておしりが出っ張ってます。
VLは本体の長さ自体は変わらないんですが、でっぱりが斜めにカットされてて、スッキリ。

完全に私見、主観ではありますが、買うならXperia VLですねー。




12日目:動いてなかったScaffold

9日めの勉強で、
ActionView::Template::Error (application.css isn't precompiled):
というエラーが出た時の対応が間違っていたので、やり直し。
このエラーはcssとjavaScriptが生成されていないこと。
対応は二種類の方法があります。いずれかをすれば良いですが、②がおすすめ。
①動的に生成されるように設定
②予め生成(プリコンパイル、プレコンパイル?)しておく。


①動的に生成されるように設定
config/environments/production.rb
のL18行目あたりの以下の行を修正
  # ↓ config.assets.compile = false
  config.assets.compile = true

②予め生成しておく。
アプリケーションのルートで以下のコマンドを実行します。
bundle exec rake precompile RAILS_ENV=production

これでScaffoldで作られたアプリが動くようになります。

んー。難しい。