2011-01-31

ゴマ酢和え

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
醤油:砂糖:酢:すりゴマ

1:1:1~2:3~4
ぐらいの比率でまぜて
ダシを適宜加えて、食材に和える

詳しいレシピは以下を参照してください。

ささみと生椎茸の炒め物

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
サラダ油を入れてささみを炒める

表面が白くなったら、砂糖を加えてよく炒める

酢と塩を入れる

椎茸を加えて炒める

詳しいレシピは以下を参照してください。

ポークソテー玉ねぎソース

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
以下のソースを準備
玉ねぎのすりおろし 大目
ニンニクのすりおろし 少な目
醤油:酢

3:1
で混ぜておく。

豚肉を塩コショウしてやいて、焼けたら皿に出す。
熱いフライパンにソースを入れてひと煮立ちさせて肉にかける

詳しいレシピは、以下を参照してください。

味噌マヨネーズホイル焼き

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
魚の切り身に味噌とマヨネーズを同量まぜて塗り、適当に他の食材をいれてアルミでつつんで10分ぐらい焼く。
最後は包みをあけて焦げ目をつけて仕上げる。

詳しいレシピは以下を参照してください。

はかせ鍋

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
保温料理用の鍋のようです。

ひと煮立ちさせた後にバスタオルにくるんだりしておくのと同じ原理のものだと思います。

バスタオルでくるんでもよいのですが、やっぱり専用の調理器具があると便利そうな気がして
キニナルのです。

豚のスライスオニオン漬け

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
豚の薄切りと玉ねぎの薄切りを交互に重ねながらレモン汁と胡椒を少々ふり、2~3時間おく。

全部まとめて強火でいためる。最後に醤油を。

ちゃんとしたレシピは以下を参照してください。

とりのレモンソース漬け

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
とりもも肉を
塩:サラダ油:レモン汁

1:2:4

パプリカ、ニンニク、胡椒を少々いれたものに半日ほど漬けて、塩焼きの要領で網で焼く

ちゃんとしたレシピは、以下を参照した方がよいです。

2011-01-28

ActiveScaffoldでセレクトボックスのソート順を変える

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveScaffoldでは、モデルでbelongs_toで指定しているモデルの内容を表示することができます。
データを変更するときもセレクトボックスを使うように指定すれば、モデルの内容のセレクトボックスを勝手に作ってくれます。

具体的な使い方は、
http://slap.s101.xrea.com/diary/log/eid465.html
が参考になります。

しかし、セレクトボックスの中身はデータの昇順になってしまっています。降順にするとか違うカラムを利用した順番でソートの順番を変更するには、以下のサイトの手段をとる必要があります。
http://grayhole.blogspot.com/2010/05/activescaffold-select-sort.html

ActiveScaffoldに手を入れないとダメなのでした。

ちなみにbelongs_toのモデルとは関係なく、普通にセレクトボックスを作成するには表示する内容をハッシュを渡してやればよいのですが順番が保障されません。
順番にこだわりたい場合は、
ActiveSupport::OrderedHash
を使う必要があります。


2011-01-27

Railsでクラス名を記述したテキストからオブジェクトを生成する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsでは、Stringクラスとかも拡張されているようです。

例えば、クラス名を記述したテキストからオブジェクトを生成する
constantize
とかです。

使い方的には、以下のような感じです。
>> aaa = "User"
=> "User"
>> ccc = aaa.constantize.new
=> #<User id: nil, name: nil, created_at: nil, updated_at: nil>
こんな感じでcccにUserクラスをnewしたオブジェクトが格納できます。

利用するクラスが違うだけで、似たような処理をしている部分があり、
なんかクラス名をいい感じに扱えないかなぁとか思っていたところ、constantizeが見つかった次第です。


2011-01-26

ActiveScaffoldでbelogns_toのモデルの内容でソートする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、ActiveScaffoldをいろいろいじっています。

ActiveScaffoldでは、あるモデルに関係している情報もいい感じで表示してくれる機能があります。
例えば、以下のモデルがあるとします。
class User < ActiveRecord::Base
  belongs_to :group
end

class Group < ActiveRecord::Base
  has_many :users

  def to_label
    "#{code}:#{name}"
  end
end

それぞれのテーブルは、以下の情報を持つとします。
users
idgroup_idname
11aaa
21bbb
33ccc

groups
idcodename
1g1xxx
2g2yyy

Userの一覧を表示するならば以下のような感じのコントローラーを作成します。
class UsersController < ApplicationController
  active_scaffold :user do |config|
    config.columns = [:id, :group, :name]

    config.columns[:group].form_ui = :select
  end
end

これで表示するとUser一覧にグループ情報としてGroupモデルのto_labelで指定した内容で一覧が以下のような感じで表示されます。
idgroupname
1g1:xxxaaa
2g1:xxxbbb
2g2:yyyccc
登録や変更をする際もgroup欄にはセレクトto_labelで指定した内容のセレクトボックスが表示され、ちゃんと対応するgroup_idがセットされて登録されることになります。

ここで表示順を以下のようにgroups.codeで降順にして、さらにuser.nameの昇順にしたいとするとします。
idgroupname
2g2:yyyccc
1g1:xxxaaa
2g1:xxxbbb

そのためにUserControllerに以下を追加します。
config.list.sorting = [{:group => :desc},{:name => :asc}]

でも、これでは以下のエラーが出てダメなのです。
Can't mix :method- and :sql-based sorting

それぞれ単独ならば問題なく動きます。

どうやらデフォルトでは、直接表示させているモデルに関するデータでソートする場合は、sqlでソートさせているのですが 関連するモデルの情報でソートする際は、データを持ってきてからActiveScaffold側でソートしているようです。
そしてソート手段が混ざるとダメなようです。

これをなんとかするには、以下のようにgroupsも検索対象に含めるように明示します。
config.columns[:group].includes = [:group]
config.columns[:group].sort_by :sql => "groups.code"

これでソートができるようになりました。

最終的なコントローラーは以下のような感じです。
class UsersController < ApplicationController
  active_scaffold :user do |config|
    config.columns = [:id, :group, :name]

    config.columns[:group].form_ui = :select
    config.columns[:group].includes = [:group]
    config.columns[:group].sort_by :sql => "groups.code"

    config.list.sorting  = [{:group => :desc},{:name => :asc}]
  end
end


2011-01-25

Railsのpublicフォルダにpukiwikiをいれてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsのpublicフォルダの下にpukiwikiをいれてみました。

ちなみにRailsはPassengerで動いています。

特に特別なこともせずに動きました。
publicフォルダの下で普通にphp動くものなのですねぇ。

pukiwikiでヘルプでも作って一緒に配布しようかなぁとか思っています。
pukiwikiはファイルベースのwikiだからRailsプロジェクトフォルダをまるまるコピーで
wikiのコンテンツも配布できるのがよさげな気がしています。

普通に別にpukiwikiを立てて、そこにヘルプとしてリンクをするのと変わらないかもしれませんが。

ちなみにWebrickではphpは動かずにたんなるテキストファイルみたいな感じでphpのソースが見えることになります。


2011-01-24

ActiveRecordで多対多の関係に属性を持たせる

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
ActiveRecordで多対多の関係を表現するには
has_and_belongs_to_many
を使うもんだと思い込んでいました。

ある人がある商品を買った場合では以下のような感じです。
class User < ActiveRecord::Base
  has_and_belongs_to_many :items
end

class Item < ActiveRecord::Base
  has_and_belongs_to_many :users
end
商品を一つづつしか買えないのならいいですが、たいてい複数個買えたりすると思います。 多対多の関係に何個買ったかという属性をつけたいと思ったわけです。 そんな時は、 has_many :through を使えばよかったことに今更に気づいてみました。 人と商品の関係を注文として定義することにします。
class User < ActiveRecord::Base
  has_many :orders
  has_many :items, :through => :orders
end

class Order < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_many :orders
  has_many :users, :through => :orders
end
これでOrderモデルに何個買ったかを定義させることができるというわけです。 このとき、うっかり has_many :orders を書き忘れて
class User < ActiveRecord::Base
  has_many :items, :through => :orders
end

class Order < ActiveRecord::Base
  belongs_to :user
  belongs_to :item
end

class Item < ActiveRecord::Base
  has_many :users, :through => :orders
end
と書いてしまうと ActiveRecord::HasManyThroughAssociationNotFoundError: Could not find the association という感じのエラーが出たりします。 以下のサイトを参考にさせていただきました。 http://wiki.usagee.co.jp/ruby/rails/RailsGuides%E3%82%92%E3%82%86%E3%81%A3%E3%81%8F%E3%82%8A%E5%92%8C%E8%A8%B3%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F%E3%82%88/Active%20Record%20Associations#v41bb3f5

2011-01-23

ActiveRecordでデータの履歴管理をする

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのActiveRecordでデータの履歴管理をするには、
acts_as_versioned
を利用するケースが多いようです。

ですが、2.3系でうまく動かす方法がよくわかりません。

で調べていたところ、
vestal_versions
というものがあり、こちらもよさげで2.3で利用できました。

使い方は、まずgemでインストール
gem install vestal_versions

で利用するRialsプロジェクトのconfig/environment.rbに
config.gem 'vestal_versions'
を記述。その後、
rake gems:install
script/generate vestal_versions
rake db:migrate
とすれば利用の準備が完了です。

履歴管理を行いたいModelに
versioned
とすれば、このModelで履歴管理ができます。

これでvestal_versions用のメソッドが追加されるのですが、重要そうなのは
version:現在の履歴version番号を返す
revert_to:データを元に戻す。元に戻すためにはversion番号とか、どれくらい前に変更したかとかを渡す感じ
ぐらいでいい気がします。

具体的な利用例は、
vestal_versions
に書いてあります。

acts_as_versionedでは
履歴管理を行いたいModelに対して専用の履歴管理テーブルを作成してデータをまるまるコピーしておく感じなのですが、
vestal_versionsでは
verions
という専用のテーブルが作成されて、これですべてのモデルの変更履歴管理をします。

acts_as_versionedでは、元のModelにmigrationで変更を加えたら、履歴テーブルにも忘れずに変更をいれないといけないようですが、vestal_versionsではその必要はなさそうです。

しかし変更履歴一覧みたいなものを見せるならば、
acts_as_versioned
では普通の1対多の結合みたいになっているので簡単に変更履歴を作成できそうです。
vestal_versionsでは変更部分のみが記録されているので、元のデータをModelとして復活させるには、
最初にversionで今のversionを取得して、
revert_toで必要なだけデータを戻す必要がありそうです。

特に履歴管理しなくてもいいのだけど、あったらあったで便利そうなことがあったので調べてみました。
他の履歴管理手段が以下のサイトで紹介されています。
http://ruby-toolbox.com/categories/activerecord_versioning.html

2011-01-14

ActiveScaffoldで日付入力でカレンダーを利用する方法

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
RailsのScaffoldを便利にするActiveScaffoldで日付入力をする際にカレンダーを利用する方法です。
calendar_date_select
というのを入れれば勝手にカレンダーを使ってくれるようになります。

インストールは、
gem install calendar_date_select
で。
そして
config/environment.rb

config.gem "calendar_date_select"
を追加すれば、もうOKです。

これだけでカレンダーが使えるようになりました。

calendar_date_selectのインストールは、pluginとしてインストールすることもできるようなのですが、どうもgemで入れないとActiveScaffoldではうまく使えない気配です。

これでカレンダーは使えるようになるのですが、このままだと日付の形式が
August 12, 2007
みたいになっていて、ちょっといまいちです。

これを
2007/08/12
の形式にする方法は以下の通りです。

まず
config/environment.rb
に以下を追加します。
CalendarDateSelect::FORMATS[:japanese] = {
  :date => "%Y/%m/%d",
  :time => " %H:%M",
  :javascript_include => "format_japanese"
}
CalendarDateSelect.format = :japanese

そして
public/javascripts/calendar_date_select/format_japanese.js
というjavascriptを以下の内容で作成します。
Date.prototype.getAMPMHour = function() { hour=Date.padded2(this.
getHours()); return (hour == null) ? 00 : (hour > 24 ? hour - 24 : hour
 ) }
Date.prototype.getAMPM = function() { return (this.getHours() < 12) ? ""
 : ""; }

Date.prototype.toFormattedString = function(include_time){
  str = this.getFullYear() + '/' + Date.padded2(this.getMonth() + 1) + '
/' +Date.padded2(this.getDate());

  if (include_time) { hour=this.getHours(); str += " " + this.
getAMPMHour() + ":" + this.getPaddedMinutes() }
  return str;
}

Date.parseFormattedString = function (string) {
  var regexp = "([0-9]{4})(\/([0-9]{2})(\/([0-9]{2})" +
               "( ([0-9]{1,2}):([0-9]{2})" +
               "?)?)?)?";
  var d = string.match(new RegExp(regexp, "i"));

  if (d==null) {
    return Date.parse(string); // Give javascript a chance to parse it.
  }

  var date = new Date(d[1], 0, 1);
  if (d[3]) { date.setMonth(d[3] - 1); }
  if (d[5]) { date.setDate(d[5]); }
  if (d[7]) {
    hours = parseInt(d[7], 10);
    date.setHours(hours);
  }
  if (d[8]) { date.setMinutes(d[8]); }

  return date;
}
これは、 http://code.google.com/p/calendardateselect/wiki/ChangingDateFormatCustom とか http://blog.champierre.com/archives/822 とかを参考にさせていただきました。 あとは、カレンダーの曜日とかの表示を日本語にしたり、calendar_date_selectで使えるオプションのforceとかをActiveScaffoldでも使えるようにしたいなぁと思っていますが、まだやり方不明です。

2011/1/17追記
カレンダーを日本語にする方法です。
public/javascripts/calendar_date_select/locale/ja.js
というjavaスクリプトを以下の内容で作成します。
文字コードはUTF-8で保存してください。
_translations = {
  "OK": "OK",
  "Now": "現在",
  "Today": "今日",
  "Clear": "閉じる"
}

Date.weekdays = $w("日 月 火 水 木 金 土");

Date.months = $w("1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月" );

そしてlayoutなりActiveScaffoldを使うときに以下のように指定すればOKです。
<%= active_scaffold_includes %>
<%= calendar_date_select_includes :locale => "ja" %>
ポイントは、active_scaffold_includesの後にcalendar_date_select_includesすることです。
active_scaffold_includesを呼べば、内部でcalendar_date_select_includesを呼んでいるので指定しなくても利用できるのですが、内部で呼んでいる時にはlocaleを渡していないので後で再度指定しちゃいました。

あとcalendar_date_selectには、テキストボックスにテキストを直接入力させずに、必ずカレンダーをクリックして入力させるoptionを指定できるのですが、ActiveScaffoldを利用しているときは、以下のようにoptionを渡します。
ちなみにopened_atが日付型のフィールドだと思ってください。
config.columns[:opened_at].options = {:popup => "force"}

bloggerに「ツイートする」やら「いいね」やらをいっぱいつけてみた

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
最近、他のブログさんを見るとTwitterへ「Tweetする」やらFacebookの「いいね」やらをよく見るのでマネして私もつけてみました。

それぞれ参考にしたのは、以下の通りです。

Twitterの「ツイートする」をつける
http://blog.umebara.com/2010/08/bloggertweet.html

Facebookの「いいね」をつける
http://cgod-kei.blogspot.com/2010/04/bloggerfacebooklike.html

ついでにブログの横に出ているTwitterの「Follow Me」のバッチもつけました。
http://jutememo.blogspot.com/2009/12/blogger-twitter-follow-me.html

さらについでにGREEにも「いいね」があるようなのでつけてみました。
http://toshiponnu.blogspot.com/2010/09/bloggergreesocial-feedback.html

前からつけていましたが、はてなブックマークのつけ方は以下の通りです。
http://blog.suz-lab.com/2010/01/blogger.html

さらに今回つけませんでしたが、mixiの「イイネ」のつけかたは以下が参考になりそうです。
http://blog.seino.biz/2010/12/bloggermixi.html

2011/1/17追記
以下の方法で記事の個別ページに関連記事リストを表示できるようになります。
http://www.kuribo.info/2009/08/blogger-2.html