Railsで多用しているselect_tagは初期値(デフォルト)を明示的に設定しないといけない?らしい。

データ自体はintegerだが、テキストボックスに入力させるのが嫌なので
[[1, 1], ..., [99, 99]]の配列をoptions_for_selectでoptionに突っ込んだ。

が、editのときにオブジェクトの値が反映されない。

Before

# @numbers = [[1, 1], ..., [99, 99]]
<%= f.select :number, options_for_select(@numbers)%>

リファレンスを見ると、:selectedオプションがあるじゃないか。

After

# @numbers = [[1, 1], ..., [99, 99]]
<%= f.select :number, options_for_select(@numbers, selected: @user[:number])%>

これでeditの場合でも値が反映されるようになる。

selectのオプションが中身をすべてeditするモデルと関連付けられたモデルになっている?場合、
わざわざselectedオプションを指定しなくても動作するようだ。

ドットインストールを使ってみての所感

3分動画でマスターする初心者向けプログラミング学習サイト - ドットインストール

動画でプログラミングを学べる、話題のドットインストール。
登録してから2ヶ月ほど放置していたけれど、最近になって触りだしてみた。
結果としては有効活用させてもらっていて、基本のレッスンを中心にすでに170近くの動画を観たことになる。
ちょっとここで感想をまとめてみたい。

触ったことがない人がイメージをつかめるようにざっくりと説明。
たとえば、「JavaScriptの基礎」という講座は全25動画からなる。
ひとつの動画の長さはおよそ一分半〜三分ほど。だいぶ短い。
なのでループの解説にしても、whileとforがそれぞれ一つの動画で解説されるくらいのボリューム。
レッスン内容としては非常にあっさりしている。
初心者を相当意識したつくりになっていると言える。


僕は以下のような感じで受講している。
・ブラウザとテキストエディタの両方の幅を縮小して一画面に表示。
・動画に併せてタイピングし、入力内容や操作手順をなぞる。

プロが入力するところを動画で見られるのだから、動画を見ながらそのスピードや操作のスムーズさを体感しない手はない。
全くの初心者では難しいかもしれないが、トライしてみればいい訓練になると思う。


個人的にドットインストールのメリットは2つ。

○達成感を得やすい。
動画を見て理解したら「完了」ボタンを押せば、受講したことが目に見えて分かる。
次々と動画を片付けることですぐに達成感を得やすい仕組みになっている。

○どんどん進められ、継続しやすい。
動画を見て理解したら「完了」ボタンを押せば、受講したことが目に見えて分かる。
次々と動画を片付けることですぐに達成感を得やすい仕組みになっている。
また、ドットインストールの動画は本当にあっさりで物足りなさを感じるほど。
だから、次々と進めることができる。
逆に一つ一つが長いと、次の動画に着手するのが億劫になる。
20レッスンあっても、まとまった時間があればあっという間に片付けることができるし、継続しやすい。

○学ぶことが多い。
実際にソースが打ち込まれる様子を眺めることができる。
これはテキストでは絶対に実現できない。
括弧を打つタイミング、タイピングのスピード、ソースの書き方(インデントなど)。
あと、声による解説も大きい。
目と耳の両方をフルに使えるから、「学んだ」感が強い。


改善してほしい点もいくつかある。
個人的に辛かったのは「ローカル開発環境の構築」。
ドットインストール内のPHPMySQLを学ぶ上でも避けて通れないこの講座だが、この動画群、Windowsには対応していない。
幸い有志の方がWindows用の手順をブログで紹介してくれていたので、そちらを参考にしたが、しかしハードルが高い。
VMをインストールし、その中にCentOSを立ち上げ、MySQLPHPを突っ込む。
初心者ならLinuxはおろか、Windowsコマンドプロンプトすら触れない人がほとんどではないか。
もし動画と異なる操作をしてしまった場合、どうリカバリーすれば良いのだろうか。

しかも、重い。想定外に重かった。
ドットインストールの動画とCentOSでマシンは精一杯。
動画の読み込みも多少遅くなるため、ストレスがあった。

ローカルにWEBサーバーを突っ込みたいなら、Windowsユーザーならxamppの方がはるかに簡単だと思うのだが、だめなんだろうか。


あと、「PHPの基礎」講座は60の動画からなる。
これは他の講座の倍近くあるため、なかなか食指が伸びない。
もう少し細切れにして、とっつきやすい講座設計にならないだろうか。


要望としては、rubyの講座がほしい。
オブジェクト指向とかRESTとか、初心者にハードルが高いところも、ぜひ。

個人的にはドットインストール、非常に気に入っているので、プログラミングが気になっている方は、一度触ってみるべき。

query_posts()を利用すると、is_single()が動作しない

Wordpressで一瞬はまったのでメモ。

single.phpもcategory.phpもindex.phpもすべて同一のテンプレートファイルから記事のループを呼び出していたら、単一記事のページでis_single()が動作せず。

記事ループ部分修正前

<?php
  query_posts( 'cat=-3' );
  if (have_posts()) : while (have_posts() ) : the_post();

(中略)

        if(is_single()): ?>
	  echo  "<p>hogehoge</p>";
        endif;
  endwhile;
  wp_reset_query();
  endif;
?>

原因はquery_posts()だった。single.phpのみ記事読み込み部分をテンプレートから呼び出すのをやめ、直接query_posts()を削除したループを書き込んでみたら動作した。

記事ループ部分修正後

<?php
  if (have_posts()) : while (have_posts() ) : the_post();

(中略)

        if(is_single()): ?>
	  echo  "<p>hogehoge</p>";
        endif;
  endwhile;
  wp_reset_query();
  endif;
?>

jQueryプラグインBlockUIのIEにおける不具合とeach()

jquery.jfeed.jsの非同期処理を連続して発生させたくなかったので、
jQueryプラグインjQuery.blockUI.jsを導入したらIEだけ動作せず。
デモページIEで確認したら普通に動作していたので謎だったが、
どうやらjQuery.blockUI.js内で使用されているeachメソッドが原因だった模様。

動作しないソース

<ul id="tabs">
    <li>
        <a href="hoge1">リスト1</a>
    </li>
    <li>
        <a href="hoge2">リスト2</a>
    </li>
    <li>
        <a href="hoge3">リスト3</a>
    </li>
</ul>
$('#tabs li').click(function(){
  test($(this).children().attr('href'));
  return false;
});
function test(str){
  $.blockUI();
  $.getFeed({  //jquery.jfeed.js
    url: str,
    success: function(feed){
      //一連の処理
      $.unblockUI;
    }
  });
}

修正後のソース

<ul id="tabs">
    <li class="list1">
        <a href="hoge1">リスト1</a>
    </li>
    <li class="list2">
        <a href="hoge2">リスト2</a>
    </li>
    <li class="list3">
        <a href="hoge3">リスト3</a>
    </li>
</ul>
$('#tabs li.list1').click(function(){
  test($(this).children().attr('href'));
  return false;
});
$('#tabs li.list2').click(function(){
  test($(this).children().attr('href'));
  return false;
});
$('#tabs li.list3').click(function(){
  test($(this).children().attr('href'));
  return false;
});
function test(str){
  $.blockUI();
  $.getFeed({  //jquery.jfeed.js
    url: str,
    success: function(feed){
      //一連の処理
      $.unblockUI;
    }
  });
}

デモページは同名の要素が複数存在するケースがないことに着目。
調べる途中で、IEでは残念ながらeach()が使えないことも判明した。

5.forEachやmapなどのjavascript1.6の新機能。基本的にはIEで使えません。IEで使うにはfirefoxのページで公開されてる互換性パッチ(例)をソースに組み込む必要があります。
» jQueryでもはまるクロスブラウザ問題まとめ: エスキュービズム ラボ Blog

このパッチを使ってみたがうまくいかなかったので(おそらくやり方が悪い)、各liに個別のクラス名を付与し、各liごとにクリック時の処理を分けたら動作した。
IEでもeach()を活用したい場合は、上記リンクを参照していただければ。

Sinatraで複数のチェックボックスのうち選択されたものだけを処理

複数のチェックボックスのうち、選択されたものだけを処理する方法。

html

  <input type="checkbox" name="id[]" value="1" checked /> 1
  <input type="checkbox" name="id[]" value="2" /> 2
  <input type="checkbox" name="id[]" value="3" checked /> 3

ruby

p params[:id] # => ["1","3"]
params[:id].each do |i|
  p i # => "1" or "3"
end

チェックボックスのnameはidでなくid[]と書くと選択されたチェックボックスvalueが配列として格納される。
eachを使うと、選択されたチェックボックスvalueがiに格納されるらしい。
params[:id][i]と書くと上記の場合うまく動作しなかった。

Sequelでの一意制約(validation)

Sequelで複数行をinsertするときに、各行ごとに一意制約違反をチェックしたかったので。

以下のサンプルのように、:textが共通で、:idのみ異なるデータを複数登録するときにこんなふうにしてみた。

class Hoge < Sequel::Model
  plugin :validation_helpers

  def validate
    validates_unique [:id, :text]
  end

  unless table_exists?
    set_schema do
      integer :id
      text :text
hard
    end
    create_table
  end  
  
end

[1,2,3].each do |i|
  hoge = Hoge.new(
    :id => i,
    :text => "hoge",
  )
  if hoge.valid?
    Hoge.insert(hoge)
  else
    hoge.errors
  end
end


validates_unique [:id, :text]と配列で表記すると、いずれも同一の場合のデータのみ弾くようになる。

validation自体はうまく動作しているみたいだが、hoge.errorsで空の配列しか返されない。
エラーメッセージはどこで指定すればいいんだろ。