ActiveRecord::Relation#merge

joinsと組み合わせて使うと関連モデルのスコープが利用できるようになる優れもの。コード例を見るとわかりやすい。 以下は日記と日記にぶら下がるコメントのモデルを表す class Diary < ActiveRecord::Base has_many :comments scope :title_like, lambda {|…

RailsのWebサーバをport 80で起動

メモ rvmsudo rails server -p 80

Passing the format in the template name is deprecated. Please pass render with :formats => [:html] instead.

renderメソッドでビューのフォーマットまで指定するとタイトルのWARNINGが出る。 対処は以下の通り # フォーマット(html)まで指定しているので× render 'form.html' # テンプレート名からフォーマットを排除し、代わりに:formatオプションに指定することで○ …

Rails(3.1 or later) productionモードが動かない

Rails3.2.1 productionモードで起動し、アプリのトップページへアクセスしたらInternal Errorが発生。 production.logには以下が吐かれていた。 ActionView::Template::Error (application.css isn't precompiled): ネットを探すと以下のページが見つかる。 …

accepts_nested_attributes_forに指定したアソシエーションは親が更新されると子も更新してくれる

accepts_nested_attributes_forってフォームから親子まとめて保存する時に使うものと思ってましたが、フォームを使わなくても親子をまとめて保存してくれるんですね。知らなかった、何て便利なのでしょう。 # ex class Diary < ActiveRecord::Base has_many …

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…

YAMLをDRYに書く

(1)共通化したい情報に「&任意の名前」というフォーマットで名前を付ける。以下の例では&addressがこれに相当。(2)共通化した情報を使用するには「 address: &address zip_code: 郵便番号 prefecture: 都道府県 city: 市区町村 street: 番地 building: 建物 …

非ActiveRecordの検証エラーメッセージをローカライズする

ActiveRecordを継承しないクラスに対し、バリデーションとそのエラーメッセージをローカライズする方法。 (1)バリデーション機能を持つクラスの実装 ポイントは冒頭のmixin。これによりActiveRecordのような振る舞いが可能となり、validatesメソッドが使える…

IE7でファイルをダウンロードする際、ファイル名が文字化けする問題

この問題はファイル名をURLエンコードすると解決する。 if request.env['HTTP_USER_AGENT'] =~ /MSIE 7/ file_name = ERB::Util.url_encode(file_name) end

自己解決 インポートにRESTなURL

(前日の日記の続き) HTTPメソッドで単数、複数を表せないのならリソースで表す他ない。 ということで インポート開始画面 GET /import/customers/new インポート実行 POST /import/customers 良い感じだと思うな。

インポートにRESTなURL

Railsで何かしらのリソースをインポートする際のURLはどのようにしたらRESTになるのか?それがわからないという話。 <顧客情報のインポートを仮定した場合> リソースは何か?→顧客 操作は何か?→リソースの作成 そのURLは?→POST /customers ↓ これだと単…

同じアソシエーションを複数回定義するとaccepts_nested_attributes_forで既存レコードの保存ができなくなる

# ex class Diary < ActiveRecord::Base has_many :comments has_many :comments accepts_nested_attributes_for :comments このようにするとDiaryインスタンスからcommentsアソシエーションをまとめて保存することができなくなる。 保存できないのは既存com…

accepts_nested_attributes_forで子から親もまとめて作成できる

ポイントは2つ ①子のモデルにaccepts_nested_attributes_forを定義 class Child belongs_to :parent accepts_nested_attributes_for :parent end ②fields_forで親のフィールドオブジェクトを生成する際に親のフィールドのname属性を自力で指定する。 親から…

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

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

ロケールに変数を使用する

ロケールファイルに変数を仕込む。形式は{{変数名}}。 # RAILS_ROOT/config/locales/ja.yml en: hello: "hello {{name}}!" ローカライズする際に変数値を渡す。変数名となるハッシュのキーは予約されている:default, :scope以外なら何でもOK。 I18n.t(:hello…

group(ActiveRecord::QueryMethods)とsize

ActiveRecordのgroupメソッドが返すGROUP BYした結果に対してsizeメソッドを呼び出すとグループ毎の件数を返す。 # グループ毎の該当件数 Person.group(:gender).size #=> {"male" => 10, "female" => 8} # 本当のレコード該当件数を取得するにはlengthメソ…

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

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…

IDを返すメソッド

メモ var id = (function(){ var id = 0; return function(){return ++id;} })(); console.log(id()); #=> 1 console.log(id()); #=> 2 console.log(id()); #=> 3

日本語でルーティングする方法

メモ # /config/routes.rb map.connect "emails/#{ERB::Util.url_encode('下書き')}/*folders", :controller => 'emails', :action => 'draft', :conditions => { :method => :get } URLエンコードしてあげれば良いということです。

SSLでファイルをダウンロードする時の注意点 for IE6〜7

メモ http://support.microsoft.com/kb/323308/ja アドレス バーのInternet Explorer 6Service Pack 1(SP1)にドキュメントの HTTPS URL を入力すると、 Microsoft Office ドキュメントまたは PDF ファイルを開こうとすると、次のエラーメッセージを表示する…

コンストラクタ?

メモ // ①コンストラクタ var foo = new (function(){this.foo = 1;})(); // ②コンストラクタ? var foo2 = (function(){this.foo = 1;return this;)(); ①②の違いを調べた。 前者の関数リテラルの中のthisは自身を指していて、後者のthisはブラウザで実行さ…

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 …

テキストフィールドが複数あるとEnter送信されない

メモ テキストフィールドを1つのみ含むフォームはEnter送信される。 <form> <input type="text" /> </form> テキストフィールドを複数含むフォームはEnter送信されない。 <form> <input type="text" /> <input type="text" /> </form> HTML学んで結構長いがこんなん知らなかった。 ちなみに以下はテキストフィールドが1つなのでEnter送信される。 <form> <input type="text" /> <input type="hidden" /> </form>