だいぶ前に capsctrldays で知って、 リンクも張ったような気がしてたんだけど、気がしてただけだったようなので今ごろ。
単に p.54 に出てくる for 文の書き方が思い出せなかっただけですが。 で、
js> var a = [0, 1, 2] js> for(var i=0,j;j=a[i];i++){print(j)} js>
なんでー?
js> a.shift() 0 js> for(var i=0,j;j=a[i];i++){print(j)} 1 2 js> 0 ? true : false false
0 が false なのにはまるんです。
さらに capsctrldays から。
>> conf.echo = false >> class Author < ActiveRecord::Base >> validates_length_of :name, :in => 2..32 >> validates_presence_of :name, :age >> validates_numericality_of :age, :only_integer => true >> end >> class Book < ActiveRecord::Base >> validates_presence_of :title, :price >> validates_numericality_of :price >> end >> author = Author.new >> p author.save false >> book = Book.new >> p book.save false >> helper.instance_variable_set(:@author, author) >> helper.instance_variable_set(:@book, book) >> html = helper.error_messages_for("author", "book") >> puts html <div class="errorExplanation" id="errorExplanation"><h2>7 errors prohibited this author from being saved</h2><p>There were problems with the following fields:</p><ul><li>Name can't be blank</li><li>Name is too short (minimum is 2 characters)</li><li>Age is not a number</li><li>Age can't be blank</li><li>Title can't be blank</li><li>Price is not a number</li><li>Price can't be blank</li></ul></div> >> IO.popen("env LANG=C w3m -dump -T text/html", "w"){|w3m| w3m.write(html)} 7 errors prohibited this author from being saved There were problems with the following fields: * Name can't be blank * Name is too short (minimum is 2 characters) * Age is not a number * Age can't be blank * Title can't be blank * Price is not a number * Price can't be blank >>
おお、いい感じ。author の Price ってのもよくわからんけど :)。どうせなら、これぐらい。
--- init.rb~ +++ init.rb @@ -4,16 +4,24 @@ def error_messages_for(*params) options = params.last.is_a?(Hash) ? params.pop.symbolize_keys : {} - objects = params.collect {|name| instance_variable_get("@#{name}")} - count = objects.inject(0) {|sum, obj| sum + obj.errors.count} + objects = params.collect {|name| [name, instance_variable_get("@#{name}")]} + invalid_objects = [] + count = objects.inject(0) {|sum, (name, obj)| + c = obj.errors.count + invalid_objects << [name, obj] + sum + c + } unless count == 0 content_tag("div", content_tag( options[:header_tag] || "h2", - "#{pluralize(count, "error")} prohibited this #{(options[:default] || params[0]).to_s.gsub("_", " ")} from being saved" + "#{pluralize(count, "error")} prohibited this #{invalid_objects.map{|name, obj| name}.join("/").gsub("_", " ")} from being saved" ) + content_tag("p", "There were problems with the following fields:") + - content_tag("ul", objects.collect{|object| object.errors.full_messages.collect { |msg| content_tag("li", msg) } }.flatten), + content_tag("ul", invalid_objects.map{ |name, obj| + content_tag("li", name.camelize) + + content_tag("ul", obj.errors.full_messages.map{|msg| + content_tag("li", msg)}.join("\n"))}.join("\n")), "id" => options[:id] || "errorExplanation", "class" => options[:class] || "errorExplanation" ) end
仕上りは、つ
7 errors prohibited this author/book from being saved There were problems with the following fields: * Author + Name can't be blank + Name is too short (minimum is 2 characters) + Age is not a number + Age can't be blank * Book + Title can't be blank + Price is not a number + Price can't be blank
なんだかなー。