Rails
joinsと組み合わせて使うと関連モデルのスコープが利用できるようになる優れもの。コード例を見るとわかりやすい。 以下は日記と日記にぶら下がるコメントのモデルを表す class Diary < ActiveRecord::Base has_many :comments scope :title_like, lambda {|…
renderメソッドでビューのフォーマットまで指定するとタイトルのWARNINGが出る。 対処は以下の通り # フォーマット(html)まで指定しているので× render 'form.html' # テンプレート名からフォーマットを排除し、代わりに:formatオプションに指定することで○ …
Rails3.2.1 productionモードで起動し、アプリのトップページへアクセスしたらInternal Errorが発生。 production.logには以下が吐かれていた。 ActionView::Template::Error (application.css isn't precompiled): ネットを探すと以下のページが見つかる。 …
accepts_nested_attributes_forってフォームから親子まとめて保存する時に使うものと思ってましたが、フォームを使わなくても親子をまとめて保存してくれるんですね。知らなかった、何て便利なのでしょう。 # ex class Diary < ActiveRecord::Base has_many …
Rails3.2.0がリリースされたので、Rails3.1.3からバージョンアップしました。その際にすんなりいかなかったので俺の歩んだ道を共有します。参考になれば幸いです。 ①まずはRails3.2.0をインストール、これは成功します。 gem install rails -v 3.2.0 ②Rails3…
ActiveRecordを継承しないクラスに対し、バリデーションとそのエラーメッセージをローカライズする方法。 (1)バリデーション機能を持つクラスの実装 ポイントは冒頭のmixin。これによりActiveRecordのような振る舞いが可能となり、validatesメソッドが使える…
この問題はファイル名をURLエンコードすると解決する。 if request.env['HTTP_USER_AGENT'] =~ /MSIE 7/ file_name = ERB::Util.url_encode(file_name) end
(前日の日記の続き) HTTPメソッドで単数、複数を表せないのならリソースで表す他ない。 ということで インポート開始画面 GET /import/customers/new インポート実行 POST /import/customers 良い感じだと思うな。
Railsで何かしらのリソースをインポートする際のURLはどのようにしたらRESTになるのか?それがわからないという話。 <顧客情報のインポートを仮定した場合> リソースは何か?→顧客 操作は何か?→リソースの作成 そのURLは?→POST /customers ↓ これだと単…
# ex class Diary < ActiveRecord::Base has_many :comments has_many :comments accepts_nested_attributes_for :comments このようにするとDiaryインスタンスからcommentsアソシエーションをまとめて保存することができなくなる。 保存できないのは既存com…
ポイントは2つ ①子のモデルにaccepts_nested_attributes_forを定義 class Child belongs_to :parent accepts_nested_attributes_for :parent end ②fields_forで親のフィールドオブジェクトを生成する際に親のフィールドのname属性を自力で指定する。 親から…
モデルに設定したバリデーションをクライアントサイドで再現するClient Side Validationsを試してちょっとハマったのでメモ。普通に使う分には下記サイトに書かれてあることを素直にやっていけば期待通りに動いてくれる・・・ https://github.com/bcardarell…
ロケールファイルに変数を仕込む。形式は{{変数名}}。 # RAILS_ROOT/config/locales/ja.yml en: hello: "hello {{name}}!" ローカライズする際に変数値を渡す。変数名となるハッシュのキーは予約されている:default, :scope以外なら何でもOK。 I18n.t(:hello…
ActiveRecordのgroupメソッドが返すGROUP BYした結果に対してsizeメソッドを呼び出すとグループ毎の件数を返す。 # グループ毎の該当件数 Person.group(:gender).size #=> {"male" => 10, "female" => 8} # 本当のレコード該当件数を取得するにはlengthメソ…
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エンコードしてあげれば良いということです。
メモ /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 …
メモ 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は通常、/log/development.logなどのログファイルに吐かれるが、これをRailsのコンソールに出力する方法。 実はとても簡単でログの吐き出し先を標準出力に指定するだけ。 ruby script/console # ログの出力先を指定する。以上…
メモ 複数バージョンのRailsをインストールしている場合にRailsスケルトンを作成すると、インストールされている中の最新のバージョンのRailsスケルトンが作成されるが、他のバージョンのRailsスケルトンを作成するには次のようにする。 # rails _version_ a…
メモ render(), redirect_to()は通常、アクションの最後の処理なので、これらのメソッドの後に処理を書くことは稀だと思うが、書けば書いたでちゃんと処理を実行してくれるようだ。 def create @diary = params[:diary] respond_to do |format| if @diary.sa…
メモ Railsのコンソールからコントローラのアクションを呼び出せるとちょっとしたテストに便利そうだなと思っていたらやっぱりできるようだ。 ruby script/console # ①URIとメソッドを指定する。 ENV['REQUEST_URI'] = "/example/index/" ENV['REQUEST_METHO…
ファイルのアップロードではまったのでメモ。 file = params[:attachment] file.read # => ファイルの中身 file.read # => "" 空の文字列 とするとアップロードしたファイルの中身を取得できるが、このreadは1回しか有効じゃないみたい。 同じファイルに対し…
will_paginateをAjax対応させる方法をネットで探していて見つけたxibbarさんの記事 http://d.hatena.ne.jp/xibbar/20080612#1213252219残念ながら私が使っているRailsやwill_paginateのバージョンと噛み合わず動作しなかったため、xibbarさんの記事を参考にA…
メモ CREATE TABLE `tables` ( `flag` char(1) NOT NULL default '0' ); などというテーブルがあったとして、このテーブルに対応するモデルのインスタンスを作るとflagには'0'が入る。 t = Table.new p t.flag #=> '0' これは便利。今までSQLを書くのが面倒…
モデル(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…
また、遅いだけならまだしも遅い為か何度やっても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? =…