サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
ドラクエ3
donghai821.hatenadiary.org
joinsと組み合わせて使うと関連モデルのスコープが利用できるようになる優れもの。 コード例を見るとわかりやすい。 以下は日記と日記にぶら下がるコメントのモデルを表す class Diary < ActiveRecord::Base has_many :comments scope :title_like, lambda {|title|where('title LIKE ?', "%#{title}%")} end class Comment < ActiveRecord::Base belongs_to :diary end この時Commentに対し、親のDiaryのtitleで検索をしたい場合、mergeを使わないと例えば以下のようにる。 class Comment < ActiveRecord::Base belongs_to :diary scope :diary_title_
accepts_nested_attributes_forってフォームから親子まとめて保存する時に使うものと思ってましたが、フォームを使わなくても親子をまとめて保存してくれるんですね。知らなかった、何て便利なのでしょう。 # ex class Diary < ActiveRecord::Base has_many :comments accepts_nested_attributes_for :comments end diary = Diary.first # 変更前のコメントは以下だとします diary.comments.first.content #=> '変更前のコメント' # コメントを変更します diary.comments.first.content = '変更後のコメント' # この状態で親を保存します diary.touch # すると子も保存してくれる diary.co
(1)共通化したい情報に「&任意の名前」というフォーマットで名前を付ける。以下の例では&addressがこれに相当。 (2)共通化した情報を使用するには「< address: &address zip_code: 郵便番号 prefecture: 都道府県 city: 市区町村 street: 番地 building: 建物 person: <<: *address company: <<: *address
まず一般的なdef メソッド()では書込み・読込みどちらも可能。 class Foo def self.bar(arg = nil) @@arg = arg || @@arg end end #書込み Foo.bar("Hello World!") => "Hello World!" #読込み Foo.bar => "Hello World!" 次にdef メソッド名=()では書込みオンリーとなります。 class Foo def self.bar=(arg = nil) @@arg = arg || @@arg end end #書込み Foo.bar = "Hello World!" => "Hello World!" #読込み Foo.bar => NoMethodError: undefined method 'bar' for FooClass
メモ インスタンスメソッドとクラスで使用する定数はprototypeオブジェクトに設定する。 このようにすることで内部的な効率がよくなるため。 var Person = function(name, gender){ this.name = name; this.gender = gender; } Person.prototype.getName = function(){return this.name}; Person.prototype.Const = "const"; クラスプロパティ・クラスメソッドはコンストラクタのプロパティに設定する。 Person.klassProperty = "クラスプロパティ"; Person.klassMethod = function() { ... }; プライベート変数はネストしたfunctionオブジェクトの中に設定する。 var Priv
メモ 複数バージョンのRailsをインストールしている場合にRailsスケルトンを作成すると、インストールされている中の最新のバージョンのRailsスケルトンが作成されるが、他のバージョンのRailsスケルトンを作成するには次のようにする。 # rails _version_ app_name rails _2.1.0_ old_skeleton 以下を参考にしました。感謝。 http://d.hatena.ne.jp/moro/20080114/1200283950
1 case文がない。 ifとelifがその代わりを果たす。Rubyの場合正確にはcase式なんだけどね。 if x == 0: # 処理 elif x == 1: # 処理 当たり前と言えば当たり前 2 キーワード引数というものがある。 キーワード引数とは関数定義時の仮引数名を使って引数を渡せる仕組みのこと。 # こういう関数があったとして def my_func(arg1 = 1, arg2 = "yes"): # 処理 # このように引数を渡せる。 my_func(arg2 = "no") 3 仮引数の最後が**引数名の場合、その引数はディクショナリを受け取る。 ディクショナリとはRubyでいうハッシュ。このディクショナリには仮引数に対応するキーワードを除いた全てのキーワード引数が入る。つまりこの形にすれば仮引数にないキーワードが使える。 def my_func(arg, **dic
1 クラスのメソッド定義の第一引数には必ずselfが必要。 class MyClass: def my_method(self): # 処理 尚、第一引数の名前は別にselfでなくてもよい。ただ慣習的にselfが使われる。 2 クラスをインスタンス化するには関数表記を使う。 class MyClass: def my_method(self): return 1 m = MyClass() # インスタンス化 m.my_method() => 1 ちなみにメソッドコールの時はselfは不要。暗黙的に現在のオブジェクトが渡される。 3 クラス名の一文字目は小文字でもよい。 よいけど、慣習的に大文字にしてるのだとか class my_class: def my_method(self): return 1 m = my_class() m.my_method() => 1 ちなみにモジュール名
1 比較を連鎖できる。 a = 2 # これを 1 < a and a < 3 => True # このように書ける 1 < a < 3 => True 2 モジュール名はファイル名。 RubyではModuleを定義する構文があり、その中でモジュール名も定義されるが Pythonではファイル名、例えばhoge.pyであればhogeがモジュール名となる。 これを取り込むには次のように書く。 import hoge 3 モジュールはクラス・関数・変数単位でimportできる。 hogeモジュールからfoo()関数のみ取り込む場合次のように書く # hoge.py def foo(): return 1 # hogeモジュールを使用するスクリプト from hoge import foo foo() => 1 複数importも可能。 # カンマで区切って複数をimport from hoge
1 irbのように対話モードがある。 Rubyではirbで対話モードを開始するがPythonでは以下のコマンドで開始する python 2 Rubyと同じく多重代入ができる。 a, b = 1, 2 a # => 1 b # => 2 多重代入という名前があることを初めて知った。 3 Rubyと同じく文字列の掛け算ができる。 ただしこの*が文字列のメソッドなのかどうかは知らない。 "a" * 3 => 'aaa' 4 対話モードでは最後に表示した式が_(アンダースコア)に代入される。 a = 1 a + 1 => 2 _ + a => 3 これはirbにもあるようです。ezookojoさん感謝です。 5 トリプルクォート("""または''')というヒアドキュメントのようなものがある """a b c """ => 'a\n b\n c\n' あっ、これはRubyにもあるようだ。知らなかった
メモ ActiveRecordが生成するSQLは通常、/log/development.logなどのログファイルに吐かれるが、これをRailsのコンソールに出力する方法。 実はとても簡単でログの吐き出し先を標準出力に指定するだけ。 ruby script/console # ログの出力先を指定する。以上。 ActiveRecord::Base.logger = Logger.new(STDOUT) # ActiveRecordを操作すると以下のようにSQLのログが出力される。 User.find(:first) [4;36;1mSQL (0.0ms)[0m [0;1mSET NAMES 'utf8'[0m [4;35;1mSQL (0.0ms)[0m [0mSET SQL_AUTO_IS_NULL=0[0m [4;36;1mUser Load (0.0ms)[0m [0;1mSELECT
メモ Railsのコンソールからコントローラのアクションを呼び出せるとちょっとしたテストに便利そうだなと思っていたらやっぱりできるようだ。 ruby script/console # ①URIとメソッドを指定する。 ENV['REQUEST_URI'] = "/example/index/" ENV['REQUEST_METHOD'] = "get" # ②ディスパッチする。 Dispatcher.dispatch ディスパッチすると以下のようにレスポンスがコンソールに出力される。 Content-Type: text/html; charset=utf-8 Set-Cookie: _session=BAh7BiIKZmxhc24501464578d2f; path=/ Status: 200 OK X-Runtime: 3.65600 ETag: "005422c12879c39354f
will_paginateをAjax対応させる方法をネットで探していて見つけたxibbarさんの記事 http://d.hatena.ne.jp/xibbar/20080612#1213252219 残念ながら私が使っているRailsやwill_paginateのバージョンと噛み合わず動作しなかったため、xibbarさんの記事を参考にAjax対応したレンダラークラスを書いたのでメモ。 class RemoteLinkRenderer < WillPaginate::LinkRenderer def page_link(page, text, attributes = {}) @template.link_to_remote text, remote_url_for(page), attributes end protected def remote_url_for(page) { :url
このページを最初にブックマークしてみませんか?
『donghai821の日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く