Rails

ActiveRecord::Relation#merge

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

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 …

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

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

非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メソ…

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…

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

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

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 …

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…

アップロードファイル.readは1回だけ有効。

ファイルのアップロードではまったのでメモ。 file = params[:attachment] file.read # => ファイルの中身 file.read # => "" 空の文字列 とするとアップロードしたファイルの中身を取得できるが、このreadは1回しか有効じゃないみたい。 同じファイルに対し…

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…

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

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

条件を保持する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分後)…

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

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