Ruby

Rubyで日本語の祝日を表示するライブラリ(holiday_jp)

Rubyで日本語の祝日を表示してくれるライブラリ(holiday_jp)の作者ブログ(http://docs.komagata.org/tags/holiday_jp/)から引用しますと>>祝日は法律によって増えたり減ったりするので未来に渡って計算で算出することができません考えてみれば確かにそう…

Rails3.2.0へのバージョンアップ

Rails3.2.0がリリースされたので、Rails3.1.3からバージョンアップしました。その際にすんなりいかなかったので俺の歩んだ道を共有します。参考になれば幸いです。 ①まずはRails3.2.0をインストール、これは成功します。 gem install rails -v 3.2.0 ②Rails3…

Railsのフォーム検証プラグイン(Client Side Validations)を試す

モデルに設定したバリデーションをクライアントサイドで再現するClient Side Validationsを試してちょっとハマったのでメモ。普通に使う分には下記サイトに書かれてあることを素直にやっていけば期待通りに動いてくれる・・・ https://github.com/bcardarell…

イテレータのショートカット

Symbolを&を使ってProc化するとイテレータのショートカットなどができる。 # これを collection.map {|member| member.id} # このように書ける。(:idの前に&を付けて、SymbolをProc化している。) collection.map &:id 便利だな、こりゃ。以下を参考にしま…

X is not missing constant Y

Railsで階層化されたモデルの関連レコードのセッターメソッドを使用すると「X is not missing constant Y」というエラーが発生する。 # 以下のモデルがあったとして # models/hatena/diary.rb # models/hatena/comment.rb class Hatena::Diary < ActiveRecor…

RubyプログラマがPythonを学び始めて知ったこと10選 ④

1 クラスのメソッド定義の第一引数には必ずselfが必要。 class MyClass: def my_method(self): # 処理 尚、第一引数の名前は別にselfでなくてもよい。ただ慣習的にselfが使われる。 2 クラスをインスタンス化するには関数表記を使う。 class MyClass: def my…

RubyプログラマがPythonを学び始めて知ったこと10選 ③

1 比較を連鎖できる。 a = 2 # これを 1 < a and a < 3 => True # このように書ける 1 < a < 3 => True 2 モジュール名はファイル名。 RubyではModuleを定義する構文があり、その中でモジュール名も定義されるが Pythonではファイル名、例えばhoge.pyであれ…

RubyプログラマがPythonを学び始めて知ったこと10選 ②

1 case文がない。 ifとelifがその代わりを果たす。Rubyの場合正確にはcase式なんだけどね。 if x == 0: # 処理 elif x == 1: # 処理 当たり前と言えば当たり前 2 キーワード引数というものがある。 キーワード引数とは関数定義時の仮引数名を使って引数を渡…

RubyプログラマがPythonを学び始めて知ったこと10選 ①

1 irbのように対話モードがある。 Rubyではirbで対話モードを開始するがPythonでは以下のコマンドで開始する python 2 Rubyと同じく多重代入ができる。 a, b = 1, 2 a # => 1 b # => 2 多重代入という名前があることを初めて知った。 3 Rubyと同じく文字列の…

Ruby 文字コード変換

メモ require 'kconv' # SJISの文字列を sjis_str = "TEST" # UTF8に変換 utf8_str = Kconv.toutf8(sjis_str) 以下を参考にしました。感謝。 http://itpro.nikkeibp.co.jp/article/COLUMN/20060927/249167/?SS=srcview&FD=1&ST=develop

Rails Mimeタイプを登録する方法

メモ /config/environment.rbなどに以下を記述 Mime::Type.register "text/plain", :sql するとコントローラで以下のように書ける。 def index @diaries = Diary.find(:all) respond_to do |format| format.html # index.html.erb format.xml { render :xml …

ActionMailer::Baseをインスタンス化できない

メモ ActionMailerの単体テストを書こうと思い、最初はActionMailer.deliver_???のテストを書いたが次の点が嫌だなと思った。 ・deliver_???は自分で書いたコードではない(???が自分で書いたコードだ) ・???で設定したビューで使用することを設定したイン…

Rspec 他のメソッド呼ぶスペックの書き方

メモ class A def call_other_method other_method1 end def other_method1 end def other_method2 end end describe A, "#call_other_methodを実行した場合" do before(:each) do @a = A.new end it "other_method1を呼ぶこと" do @a.should_receive(:other…

render_to_stringメソッドとBuilderを使ってXML文字列を生成する方法

メモ Builderを使ってXMLのレスポンスを生成するには以下のようにrespond_to()を使うのだが・・・ # ビュー(show.xml.builder) xml.diary do xml.title @diary.title end # Diariesコントローラ def show @diary = Diary.find(params[:id]) respond_to do …

ActiveRecordが生成するSQLをRailsのコンソールで確認する方法

メモ ActiveRecordが生成するSQLは通常、/log/development.logなどのログファイルに吐かれるが、これをRailsのコンソールに出力する方法。 実はとても簡単でログの吐き出し先を標準出力に指定するだけ。 ruby script/console # ログの出力先を指定する。以上…

バージョンを指定してRailsスケルトンを作成する方法

メモ 複数バージョンのRailsをインストールしている場合にRailsスケルトンを作成すると、インストールされている中の最新のバージョンのRailsスケルトンが作成されるが、他のバージョンのRailsスケルトンを作成するには次のようにする。 # rails _version_ a…

アクションの中のrender(), redirect_to()の後の処理は実行される

メモ render(), redirect_to()は通常、アクションの最後の処理なので、これらのメソッドの後に処理を書くことは稀だと思うが、書けば書いたでちゃんと処理を実行してくれるようだ。 def create @diary = params[:diary] respond_to do |format| if @diary.sa…

Railsのコンソールからコントローラのアクションを呼び出す方法

メモ Railsのコンソールからコントローラのアクションを呼び出せるとちょっとしたテストに便利そうだなと思っていたらやっぱりできるようだ。 ruby script/console # ①URIとメソッドを指定する。 ENV['REQUEST_URI'] = "/example/index/" ENV['REQUEST_METHO…

複数のキーでソート

メモ class User attr_reader :id, :name def initialize(id, name) @id, @name = id, name end end class Array def custom_sort(orders) self.sort do |a, b| Array.compare(a, b, orders) end end def self.compare(a, b, orders) orders.each_with_index…

Ajax対応したwill_paginate(Version 2.3.5) For Rails2.2.2

will_paginateをAjax対応させる方法をネットで探していて見つけたxibbarさんの記事 http://d.hatena.ne.jp/xibbar/20080612#1213252219残念ながら私が使っているRailsやwill_paginateのバージョンと噛み合わず動作しなかったため、xibbarさんの記事を参考にA…

Stringの連結 +=と<<の違い

+=の場合(予想通りの結果になる) a = "a" b = a b += 'b' p b # => "ab" p a # => "a" a = "a" b = a b << 'b' p b # => "ab" p a # => "ab"

クラスメソッドから擬似的にインスタンスメソッドを呼ぶ

メモ Class Foo def self.foo bar end def bar 'bar' end end Foo.foo #=> NameError : undefined local variable or method `bar` for Foo:Class などとクラスメソッドから同クラスのインスタンスメソッドを呼ぶと怒られるが Class Foo def self.foo f = Fo…

ActiveRecordはテーブル定義の初期値を認識する

メモ CREATE TABLE `tables` ( `flag` char(1) NOT NULL default '0' ); などというテーブルがあったとして、このテーブルに対応するモデルのインスタンスを作るとflagには'0'が入る。 t = Table.new p t.flag #=> '0' これは便利。今までSQLを書くのが面倒…

同じクラスに同じ名前のインスタンスメソッドとクラスメソッドが定義できる。

メモ class Foo def foo 'instance method' end def self.foo 'class method' end end f = Foo.new f.foo #=> 'instance method' Foo.foo #=> 'class method'

条件を保持するpagination

モデル(Memo)に検索をするアクション def search @memo = Memo.new(params[:memo]) @memo_pages, @memos = paginate :memos, :per_page => 10, :conditions => ["memo like ?", "%#{params[:memo][:memo]}%"] render :action => 'list' end listビューのpagi…

我が家のPCでリモートインストールを行うとやたら時間がかかる。

また、遅いだけならまだしも遅い為か何度やってもActiveRecordのインストールに失敗する。gem install rails Bulk updating Gem source index for: http://gems.rubyforge.org ↓(約40分後) Install required dependency activesupport? [Yn] ↓(約10分後)…

メソッド定義の際にdef メソッド名=()とするとそのメソッドに=を使って引数を渡すことができますがが、一般的なdef メソッド名()と引数の渡し方が異なるほかに前者は書込み(代入)Onlyということがわかった。

まず一般的なdef メソッド()では書込み・読込みどちらも可能。 class Foo def self.bar(arg = nil) @@arg = arg || @@arg end end #書込み Foo.bar("Hello World!") => "Hello World!" #読込み Foo.bar => "Hello World!" 次にdef メソッド名=()では書込みオ…

コレクションを含むフォームを作る際の注意点

【自分が躓いたので忘れぬようメモ】コレクションのフォームエレメントをヘルパーで生成する際モデル名にあたる部分に[]を付ける。 text_field("model_name[]", "column_name") すると以下のHTMLが生成される。 # コレクションのインスタンスがnew_record? =…