名を名乗れ。
とりあえず、ユーザmodelの中に、本名の項目を作ろう。
family_nameとmiddle_nameとgiven_nameね。
外人も使うかも知れないからねwww
$ script/generate migration AddColumnFamilyNameAndMiddleNameAndGivenNameToUser family_name:string middle_name:string given_name:string
んで、編集。
db/migrate/*数字*_add_column_family_name_and_middle_name_and_given_name_to_user.rb
class AddColumnFamilyNameAndMiddleNameAndGivenNameToUser < ActiveRecord::Migration def self.up add_column :users, :family_name, :string, :limit => 100, :default => '' add_column :users, :middle_name, :string, :limit => 100, :default => '', :null => true add_column :users, :given_name, :string, :limit => 100, :default => '' end def self.down remove_column :users, :given_name remove_column :users, :middle_name remove_column :users, :family_name end end
middle_nameは、無い場合があるけど、まあ、普通の文化圏の方なら、名字と名前は無い事は無いでしょう。
ホントに?www
んで、validationを書こう。
app/models/user.rb
validates_format_of :email, :with => Authentication.email_regex, :message => Authentication.bad_email_message + validates_presence_of :family_name + validates_format_of :family_name, :with => Authentication.name_regex, :message => Authentication.bad_name_message + validates_length_of :family_name, :maximum => 100 + + validates_format_of :middle_name, :with => Authentication.name_regex, :message => Authentication.bad_name_message, :allow_nil => true + validates_length_of :middle_name, :maximum => 100 + + validates_presence_of :given_name + validates_format_of :given_name, :with => Authentication.name_regex, :message => Authentication.bad_name_message + validates_length_of :given_name, :maximum => 100 + # HACK HACK HACK -- how to do attr_accessible from here?
んじゃあ、ちょっとfixture書き換える。
test/fixtures/users.yml
nickname: quentin + family_name: Family + middle_name: Middle + given_name: Given email: quentin@example.com nickname: aaron + family_name: Hogehoge + middle_name: + given_name: Fugafuga email: aaron@example.com nickname: old_password_holder + family_name: 名字 + middle_name: ミドル・ネーム + given_name: 名前 email: salty_dog@example.com nickname: admin + family_name: アドミン + middle_name: ザ + given_name: 管理者 email: admin@example.com
んで、テストコードを足す。
test/unit/user_test.rb
fixtures :users + def test_invalid_with_empty_attributes + user = User.create + assert !user.valid? + assert user.errors.invalid?(:nickname) + assert user.errors.invalid?(:email) + assert user.errors.invalid?(:family_name) + assert user.errors.invalid?(:given_name) + end
んで、テスト。
$ ruby test/unit/user_test.rb => Loaded suite test/unit/user_test => Started => . => Finished in 0.108762 seconds. => => 1 tests, 5 assertions, 0 failures, 0 errors
ん、スバラシイぃ:-)
まあ、何がわかったって、新規User作成時に、nicknameとemailとfamily_nameとgiven_nameのいずれかで、validation_hogehogeがエラーを返してないかどうかを見ているだけなんだけどwww
まあ、でも、今やったのって、validation書いただけだもんねぇ...
んじゃあ、もう少し、コードを足すか。
test/unit/user_test.rb
+ def test_invalid_with_empty_attributes + user = User.create + assert !user.valid? + assert user.errors.invalid?(:nickname) + assert user.errors.invalid?(:email) + assert user.errors.invalid?(:family_name) + assert user.errors.invalid?(:given_name) + end + + def test_should_create_user + assert_difference 'User.count' do + user = create_user + assert !user.new_record?, "#{user.errors.full_messages.to_sentence}" + end + end + + protected + def create_user(options = {}) + record = User.new({ + :nickname => "Nick", + :email => 'quire@example.com', + :password => 'quire69', + :password_confirmation => 'quire69', + :family_name => "Family", + :middle => "Middle", + :given_name => "Given" + }.merge(options)) + record.register! if record.valid? + record + end +
んで、テスト。
$ ruby ./test/unit/user_test.rb Loaded suite test/unit/user_test Started .F Finished in 0.081857 seconds. 1) Failure: => test_should_create_user(UserTest) => [test/unit/user_test.rb:21:in `test_should_create_user' => /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/core_ext/test/unit/assertions.rb:46:in `assert_difference' => test/unit/user_test.rb:19:in `test_should_create_user' => /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `__send__' => /opt/local/lib/ruby/gems/1.8/gems/activesupport-2.2.2/lib/active_support/testing/setup_and_teardown.rb:60:in `run']: => Nickname can't be blank and Family name can't be blank and Given name can't be blank. => <false> is not true. => => 2 tests, 6 assertions, 1 failures, 0 errors
ん?
んん?
ん〜...
で、はまったはまったwww
結局、どうも、Userモデルで、attr_accessibleにfamily_nameとmiddle_nameとGiven_nameを指定していないから、ということに到達しましたwww
いやあ、これが、結局ここで何時間も止まることになる訳ですがwww
んで、修正。
app/models/user.rb
- attr_accessible :login, :email, :name, :password, :password_confirmation + attr_accessible :email, :password, :password_confirmation, :nickname, :family_name, :middle_name, :given_name
で、これでどうよ?
$ ruby ./test/unit/user_test.rb => Loaded suite test/unit/user_test => Started => .E => Finished in 0.142293 seconds. => => 1) Error: => test_should_create_user(UserTest): => SocketError: getaddrinfo: nodename nor servname provided, or not known (略) => 2 tests, 5 assertions, 0 failures, 1 errors
はいいいいっ!?
で、はまるはまるwwww
結局、どうも、config/initializers/mail.rbで、設定を端折っていたからだと思われ。
で、ちゃんと設定して、
$ ruby test/unit/user_test.rb Loaded suite test/unit/user_test Started .E =>Finished in 2.002131 seconds. => => 1) Error: =>test_should_create_user(UserTest): =>Net::SMTPFatalError: 550 5.1.2 Bad destination system: quire@example.com (略) => 2 tests, 5 assertions, 0 failures, 1 errors
はいいいっ!?
じゃあ、test/unit/user_test.rbのcreate_userメソッドの中の:emailを、まともなメールアドレスに書き換える。
=> Loaded suite test/unit/user_test => Started => .E => Finished in 3.069374 seconds. => => 1) Error: => test_should_create_user(UserTest): => Net::SMTPFatalError: 550 5.7.0 From address is not one of your addresses. (略) => 2 tests, 5 assertions, 0 failures, 1 errors
もう、なんか、ねwww
どうでもイイ気がしてきたwww