blog.waterlow.work

Ruby, Rails, js, etc...

【haml】【sublime】【はまってる】build systemをautomaticにするとビルドされない

sublime textでhamlの勉強をしようと思った矢先にはまりました。
下記の記事を参考にsublimeで保存時に自動的にhtmlに変換してくれるような環境を作ろうとしてました。
Hamlで開発効率アップ|Sublime text 2でビルドしてみました。 | Developers.IO
Haml 導入メモ / jotaki.tv
Sublime Text 2でHaml, Sass, CofeeScriptを保存時に自動コンパイル - $Ikasama->blog

その中でbuild system->hamlにしてcom+Bを押すとビルドできるのですが、build system->automaticにするとどうしてもビルドしてくれません。

haml.sublime-build

{
  "cmd": "haml",
  "selector": "source.haml",
  "working_dir": "${file_path}",

"windows": 
  { "cmd": ["haml.bat", "$file", "$file_path/$file_base_name.html"] },

"osx":
  { "cmd": ["haml", "$file", "$file_path/$file_base_name.html"], }
}

下記によるとselectorの指定に応じてビルドシステムを選択しているらしい。
Build Systems — Sublime Text Unofficial Documentation
であればビルドシステムとしてはhamlが選択されるはずなのだけど…。
haml.sublime-buildをRuby Haml.sublime-buildにしてみたけどダメでした。
あとは何をしたらいいのかもちょっとわかりませぬ…。
どこか他のところにも設定を書かないといけないのかな!

【haml】【Ruby】ちょっとした処理をrubyで書く

htmlからhamlを作ってくれる便利なサイト
HTML2Haml | Convert HTML Snippets to Haml
htmlでデザインが上がっているときはこれでhamlを作って、あとrailsなのでaタグやinputタグをlink_toやform_forなどに書き換えているわけですが、いくつか難点が。

1.
→%br/、→%img{:src => ""}/となるが、末尾のスラッシュは不要(brやimgはhamlでは閉じタグ不要の宣言は必要ない。)
2.imgはimg_tagに、aタグはlink_toに等、html→hamlhaml-rails的な変換ができたらいい。
3.インデントは一番オーソドックスな形で変換されるが、cssをばりばり使っていてインデントだけでもデザインが崩れることがたまーにあるので、なるべく元のhtmlに近いものを出したい。

明らかに1が簡単そうなので1から取り組んでみる。

個人的に使うものなのでStringクラスをオープンしちゃう!
せっかくなのでsendやdefine_methodで無理矢理メタにしてみる

これはメタにしなくて良い例でしたね…。メタプログラミングの使い所がわからない!

【JS】【Coffee】CoffeeScriptはじめました

最近RubyよりJavaScriptのほうがなんかいいです。
viewをしっかり作るなら避けては通れないJSの話です。
そして最近は書くのはCoffeeScriptのみとなってしまいました…。

自分で書けるように少しづつ勉強してきます。

環境は以下のどちらかを使う。

http://coffeescript.org/
http://phantomjs.org/

前者はCoffeeScriptのサイトで、書いたものがすぐ横でJSに変換される。JSが多少読めると「へー」となる。ただ自分が今どこにいるのかよく分からない。(トップレベルなのかどこかのクラスなのか)

後者はコマンドラインでJSを実行するライブラリ。Coffeeにも対応している。ただメインで使うのはブラウザなだけに基本的な文法しか勉強出来ない。あと生成されたJSがどんなかわからない。

message = "Hello World"
if message.length > 1
  alert message

これが

var message;

message = "Hello World";

if (message.length > 1) {
  alert(message);
}

こうなる。RubyPythonの影響を強く受けているらしくとてもシンプル!
個人的には、インデントでブロックを制御するのは多少慣れてきたけれどまだまだ読みにくい。

alert "ok" if name?

あとこれも便利そう。

if (typeof name !== "undefined" && name !== null) {
  alert("ok");
}

RubyのRangeみたいなものから配列を作れたり、連想配列に括弧がいらなかったりと、いろいろ便利そうなのですが如何せん使う場面がない。
現場でもclass定義とか見たことない(これはRailsだからかもしれないけど)。

あと良く見る記号

$ ->
  #メインの処理

これは

jQuery(function() {
  /*メインの処理*/
});

となる。jQueryを書くときの標準的な書き方。らしい!

【偉大なプログラマに学ぶ】アジャイルソフトウェア開発宣言の17人(2)

アジャイルソフトウェア開発宣言

プロセスやツールよりも個人と対話を
包括的なドキュメントよりも動くソフトウェアを
契約交渉よりも顧客との協調を
計画に従うことよりも変化への対応を

間が開いてしまいましたが第二弾です!!
最近新しいコミュニティに参加させて頂いて、やる気の高まりを感じてます!
こういう時にいろいろ吸収しよう!!
そして残りは次回!!

Martin Fowler

リファクタリング本、UMLモデリングのエッセンス等の著者。
ThoughtWorksの主席技術者。
日本語のblikiページがあるが2005年以降更新されていない
Bliki

James Grenning

テスト駆動開発による組み込みプログラミング」の著者。
本を書くだけあって組み込みアジャイル開発の第一人者。
Wingman Software所属
http://wingman-sw.com/about

Jim Highsmith

Agile Project Management」の著者。
ThoughtWorks社所属。
Jim Highsmith | Jim Highsmith
@jimhighsmith

Ron Jeffries

Amazon.co.jp: XPエクストリームプログラミング実践入門: ロン・ジェフリーズ: 本の著者。
Xprogramming.com
@RonJeffries

Jon Kern
Brian Marick
Robert C. Martin
Steve Mellor
Ken Schwaber
Jeff Sutherland
Dave Thomas

Kent Beck

エクストリームプログラミングJUnitテスト駆動開発入門など。
17人の中では名前を知っている人も多いのでは。
Three Rivers Institute
ツイッター:@KentBeck
 

Mike Beedle

Agile Software Development with Scrumの著者。
スクラム開発をいち早く取り入れた人物の1人。
スクラムを企業やチームに導入するための教育やコンサルティングを行っている。
Mike Beedle | Profile | Scrum Alliance
ツイッター:@mikebeedle

Arie van Bennekum

アジャイルプロジェクトマネジメントのための公演やレクチャーをやっている(とある)。
Arie van Bennekum :: Agilia
ツイッター:@arievanbennekum

Ward Cunningham

WikiWikiを作った人!ケント・ベックとともにエクストリームプログラミングを提唱。
Interview With Ward Cunningham | Dr Dobb's
ツイッター:@WardCunningham
あと2回ぐらいに分けて書いていきます!英語の記事が多くて大変!!!
もし間違っているところやこんなことも書けよ的なことがあればぜひぜひおしえてください。

【Rails】modelでroutes.rbが作ったpathを使うとき

先週から詰まっていた所がやっと解決した。
Railsのmodel内のクラスからuser_うんたら_かんたら_pathを一生懸命呼ぼうとしてた。
でも未定義と言われる…。
でもあてはただのstringだしどうしたもんかと…。

正解としては、まずmodelからは基本は上のようなpath表記は呼び出せない。
まずリクエストを得て何かするのはcontrollerの役目。
また静的ならばviewで済ますことも。

どちらにせよmodelでurlが必要なことは上2つに比べると少なそう。
しかもmodelからさっきのpathの表記が呼び出せるとdbにそのurlが書き込めるわけだが、書き込む際はstringとして保存されるため、routes.rbが変わればdbに保存される情報も変わる。しかし昔保存したデータはそのまんまということになる。うん…。

でも、たとえば通販サイトなら商品と商品詳細へのurlは紐付いて欲しい気がする。
こうゆうときどうしてるの??勉強しよ!!

長くなったけどさっきの問題は以下のコードを入れるだけで解決出来ます

include Rails.application.routes.url_helpers
# 魔法みたいなpath表記をmodelにも入れておく方法

【Rails】なんたらかんたら_pathって実際はなにしてるんだっけ?的な話

RubyRailsの環境

$ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [x86_64-darwin13.0]
$rails -v
Rails 4.1.5

ここで土台作りする。

$rails new study_path
$cd study_path
$rails g scaffold book isbn:string title:string price:integer publish:string published:date cd:boolean
$rake db:migrate

さあ始めよう!!

app/views/books/index.html.erbを見る(hamlにしちゃいましたhttp://html2haml.heroku.com/

%h1 Listing books
%table
  %thead
    %tr
      %th Isbn
      %th Title
      %th Price
      %th Publish
      %th Published
      %th Cd
      %th{:colspan => "3"}
  %tbody
    - @books.each do |book|
      %tr
        %td= book.isbn
        %td= book.title
        %td= book.price
        %td= book.publish
        %td= book.published
        %td= book.cd
        %td= link_to 'Show', book
        %td= link_to 'Edit', edit_book_path(book)
        %td= link_to 'Destroy', book, method: :delete, data: { confirm: 'Are you sure?' }
%br/
= link_to 'New Book', new_book_path

さらに以下の行に注目

%td= link_to 'Edit', edit_book_path(book)
= link_to 'New Book', new_book_path

この「go_to_the_path」な書き方。
「便利なグローバルメソッドか変数みたいなやつで、どこからでも呼べる!」といいう考えをなんとなく持っていた。が、全然違うらしい。以下のコマンドを打ってみる。

$rake routes
   Prefix Verb   URI Pattern               Controller#Action
    books GET    /books(.:format)          books#index
          POST   /books(.:format)          books#create
 new_book GET    /books/new(.:format)      books#new
edit_book GET    /books/:id/edit(.:format) books#edit
     book GET    /books/:id(.:format)      books#show
          PATCH  /books/:id(.:format)      books#update
          PUT    /books/:id(.:format)      books#update
          DELETE /books/:id(.:format)      books#destroy

(すごく見にくいけど)真ん中の列のパスを左の列_pathで呼び出す。すると右の列のコントローラーのアクションが自動的に呼ばれる。という仕組み。
で、このテーブルはどう作られるかというと、config/routes.rbに書いてあるように記載されるらしい。

hamlやるときに詰まったとこ

最近ちょっと触っているhamlについて触れました。
ただこいつ、Railsを書くとやたらはまります。(私だけ?)
しかも大体の場合が構文エラーなので、割としょうもない。
なのでそういった手間を少しでも省こうということでここにまとめます。

兄弟のタグ(?)は同じインデントに。

これはダメ

%table
  %tr
  %td りんご
    %td 甘酸っぱい
    %td おおむね赤
  %tr
    %td なつみかん
    %td かなり酸っぱいと思う
    %td たいてい黄色

これはOK

%table
  %tr
  %td りんご
  %td 甘酸っぱい
  %td おおむね赤
  %tr
    %td なつみかん
    %td かなり酸っぱいと思う
    %td たいてい黄色

なぜなのかはわかりませんが、親子関係は無視してもいいけれど横の足並みはそろえましょうと…

ハイフンでRubyの式を評価するときはインデントしない!

これはダメ

%h1 Hello#index
%p Find me in app/views/hello/index.html.haml
  - num = Random.new.rand(10)
  - if (num % 2 == 0)
    #{num}
  - else
    odd
%h1 Hello#index
%p Find me in app/views/hello/index.html.haml
- num = Random.new.rand(10)
- if (num % 2 == 0)
  #{num}
- else
  odd

これはOK

条件式のあとはインデントを下げて何かしら書く

これはダメ

%table
  %tr
    %td りんご
    - if false
    %td 甘酸っぱい
    %td おおむね赤
  %tr
    %td なつみかん
    %td かなり酸っぱいと思う
    %td たいてい黄色
%table
  %tr
    %td りんご
    - if false
      - p  'never do'
    %td 甘酸っぱい
    %td おおむね赤
  %tr
    %td なつみかん
    %td かなり酸っぱいと思う
    %td たいてい黄色

これはOK
普通に書いていたらやらないかもですが、はじめの探り探りの状態でハマってしましました。
以下の記事にも書いています。
ブロック引数を使う場合の haml のシンタックスエラー - u16suzuの blog
他にもhtmlに出力する用のコメントで引っかかったりすることもあるみたい…。
なれるまでは探り探りですがなれればviewページをスイスイ書けると信じて!!!