From fdd1ef5ca26de29eee3e5246e609c883ea3d9319 Mon Sep 17 00:00:00 2001 From: CassioMarques Date: Wed, 12 Nov 2008 21:40:29 -0200 Subject: Added 'custom validations' to AR validations and callbacks guide --- .../html/activerecord_validations_callbacks.html | 38 +++++++++++++++++++++- .../source/activerecord_validations_callbacks.txt | 30 +++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/railties/doc/guides/html/activerecord_validations_callbacks.html b/railties/doc/guides/html/activerecord_validations_callbacks.html index 209722e9e0..45eec6ffa1 100644 --- a/railties/doc/guides/html/activerecord_validations_callbacks.html +++ b/railties/doc/guides/html/activerecord_validations_callbacks.html @@ -264,6 +264,9 @@ ul#navMain {
  • + Writing your own validation methods +
  • +
  • Changelog
  • @@ -702,7 +705,40 @@ http://www.gnu.org/software/src-highlite --> end -

    6. Changelog

    +

    6. Writing your own validation methods

    +
    +

    When the built-in validation helpers are not enough for your needs, you can write your own validation methods, by implementing one or more of the validate, validate_on_create or validate_on_update methods. As the names of the methods states, the right method to implement depends on when you want the validations to be ran. The meaning of valid is still the same: to make an object invalid you just need to add a message to it's errors collection.

    +
    +
    +
    class Invoice < ActiveRecord::Base
    +  def validate_on_create
    +    errors.add(:expiration_date, "can't be in the past") if !expiration_date.blank? and expiration_date < Date.today
    +  end
    +end
    +
    +

    If your validation rules are too complicated and you want to break it in small methods, you can implement all of them and call one of validate, validate_on_create or validate_on_update methods, passing it the symbols for the methods' names.

    +
    +
    +
    class Invoice < ActiveRecord::Base
    +  validate :expiration_date_cannot_be_in_the_past, :discount_cannot_be_be_more_than_total_value
    +
    +  def expiration_date_cannot_be_in_the_past
    +    errors.add(:expiration_date, "can't be in the past") if !expiration_date.blank? and expiration_date < Date.today
    +  end
    +
    +  def discount_cannot_be_greater_than_total_value
    +    errors.add(:discount, "can't be greater than total value") unless discount <= total_value
    +  end
    +end
    +
    +
    +

    7. Changelog

    diff --git a/railties/doc/guides/source/activerecord_validations_callbacks.txt b/railties/doc/guides/source/activerecord_validations_callbacks.txt index 29be2182ce..3da4f0361b 100644 --- a/railties/doc/guides/source/activerecord_validations_callbacks.txt +++ b/railties/doc/guides/source/activerecord_validations_callbacks.txt @@ -369,6 +369,36 @@ class Account < ActiveRecord::Base end ------------------------------------------------------------------ +== Writing your own validation methods + +When the built-in validation helpers are not enough for your needs, you can write your own validation methods, by implementing one or more of the +validate+, +validate_on_create+ or +validate_on_update+ methods. As the names of the methods states, the right method to implement depends on when you want the validations to be ran. The meaning of valid is still the same: to make an object invalid you just need to add a message to it's +errors+ collection. + +[source, ruby] +------------------------------------------------------------------ +class Invoice < ActiveRecord::Base + def validate_on_create + errors.add(:expiration_date, "can't be in the past") if !expiration_date.blank? and expiration_date < Date.today + end +end +------------------------------------------------------------------ + +If your validation rules are too complicated and you want to break it in small methods, you can implement all of them and call one of +validate+, +validate_on_create+ or +validate_on_update+ methods, passing it the symbols for the methods' names. + +[source, ruby] +------------------------------------------------------------------ +class Invoice < ActiveRecord::Base + validate :expiration_date_cannot_be_in_the_past, :discount_cannot_be_be_more_than_total_value + + def expiration_date_cannot_be_in_the_past + errors.add(:expiration_date, "can't be in the past") if !expiration_date.blank? and expiration_date < Date.today + end + + def discount_cannot_be_greater_than_total_value + errors.add(:discount, "can't be greater than total value") unless discount <= total_value + end +end +------------------------------------------------------------------ + == Changelog http://rails.lighthouseapp.com/projects/16213/tickets/26-active-record-validations-and-callbacks -- cgit v1.2.3 From 0fbfd4fe0d79d3f9c6fb91f5458fb4f23f768dd7 Mon Sep 17 00:00:00 2001 From: CassioMarques Date: Wed, 12 Nov 2008 21:42:52 -0200 Subject: Fix typo on 'custom validations', at AR validation and callbacks guide --- railties/doc/guides/source/activerecord_validations_callbacks.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/railties/doc/guides/source/activerecord_validations_callbacks.txt b/railties/doc/guides/source/activerecord_validations_callbacks.txt index 3da4f0361b..fd6eb86b0b 100644 --- a/railties/doc/guides/source/activerecord_validations_callbacks.txt +++ b/railties/doc/guides/source/activerecord_validations_callbacks.txt @@ -387,7 +387,7 @@ If your validation rules are too complicated and you want to break it in small m [source, ruby] ------------------------------------------------------------------ class Invoice < ActiveRecord::Base - validate :expiration_date_cannot_be_in_the_past, :discount_cannot_be_be_more_than_total_value + validate :expiration_date_cannot_be_in_the_past, :discount_cannot_be_more_than_total_value def expiration_date_cannot_be_in_the_past errors.add(:expiration_date, "can't be in the past") if !expiration_date.blank? and expiration_date < Date.today -- cgit v1.2.3 From bb0fead1dbc1470717019efcabe6c90da3cf934d Mon Sep 17 00:00:00 2001 From: Colin Curtin Date: Wed, 12 Nov 2008 16:00:27 -0800 Subject: The beginnings of a command line tutorial --- railties/doc/guides/source/command_line.txt | 147 ++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 railties/doc/guides/source/command_line.txt diff --git a/railties/doc/guides/source/command_line.txt b/railties/doc/guides/source/command_line.txt new file mode 100644 index 0000000000..5f7c6ceff5 --- /dev/null +++ b/railties/doc/guides/source/command_line.txt @@ -0,0 +1,147 @@ +A Guide to The Rails Command Line +================================= + +Rails comes with every command line tool you'll need to + +* Create a Rails application +* Generate models, controllers, database migrations, and unit tests +* Start a development server +* Mess with objects through an interactive shell +* Profile and benchmark your new creation + +... and much, much more! (Buy now!) + +This tutorial assumes you have basic Rails knowledge from reading the Getting Started with Rails Guide. + +== Command Line Basics == + +There are a few commands that are absolutely critical to your everyday usage of Rails. In the order of how much you'll probably use them are: + +* console +* server +* rake +* generate +* rails + +Let's create a simple Rails application to step through each of these commands in context. + +=== rails === + +The first thing we'll want to do is create a new Rails application by running the `rails` command after installing Rails. + +NOTE: You know you need the rails gem installed by typing `gem install rails` first, right? Okay, okay, just making sure. + +[source,shell] +------------------------------------------------------ +$ rails commandsapp + + create + create app/controllers + create app/helpers + create app/models + ... + ... + create log/production.log + create log/development.log + create log/test.log +------------------------------------------------------ + +Rails will set you up with what seems like a huge amount of stuff for such a tiny command! You've got the entire Rails directory structure now with all the code you need to run our simple application right out of the box. + +NOTE: This output will seem very familiar when we get to the `generate` command. Creepy foreshadowing! + +=== server === + +Let's try it! The `server` command launches a small web server written in Ruby named WEBrick which was also installed when you installed Rails. You'll use this any time you want to view your work through a web browser. + +NOTE: WEBrick isn't your only option for serving Rails. We'll get to that in a later section. [XXX: which section] + +Here we'll flex our `server` command, which without any prodding of any kind will run our new shiny Rails app: + +[source,shell] +------------------------------------------------------ +$ cd commandsapp +$ ./script/server +=> Booting WEBrick... +=> Rails 2.2.0 application started on http://0.0.0.0:3000 +=> Ctrl-C to shutdown server; call with --help for options +[2008-11-04 10:11:38] INFO WEBrick 1.3.1 +[2008-11-04 10:11:38] INFO ruby 1.8.5 (2006-12-04) [i486-linux] +[2008-11-04 10:11:38] INFO WEBrick::HTTPServer#start: pid=18994 port=3000 +------------------------------------------------------ + +WHOA. With just three commands we whipped up a Rails server listening on port 3000. Go! Go right now to your browser and go to http://localhost:3000. I'll wait. + +See? Cool! It doesn't do much yet, but we'll change that. + +=== generate === + +The `generate` command uses templates to create a whole lot of things. You can always find out what's available by running `generate` by itself. Let's do that: + +[source,shell] +------------------------------------------------------ +$ ./script/generate +Usage: ./script/generate generator [options] [args] + +... +... + +Installed Generators + Builtin: controller, integration_test, mailer, migration, model, observer, performance_test, plugin, resource, scaffold, session_migration + +... +... +------------------------------------------------------ + +NOTE: You can install more generators through generator gems, portions of plugins you'll undoubtedly install, and you can even create your own! + +Using generators will save you a large amount of time by writing *boilerplate code* for you -- necessary for the darn thing to work, but not necessary for you to spend time writing. That's what we have computers for, right? + +Let's make our own controller with the controller generator. But what command should we use? Let's ask the generator: + +NOTE: All Rails console utilities have help text. For commands that require a lot of input to run correctly, you can just try the command without any parameters (like `rails` or `./script/generate`). For others, you can try adding `--help` or `-h` to the end, as in `./script/server --help`. + +[source,shell] +------------------------------------------------------ +$ ./script/generate controller +Usage: ./script/generate controller ControllerName [options] + +... +... + +Example: + `./script/generate controller CreditCard open debit credit close` + + Credit card controller with URLs like /credit_card/debit. + Controller: app/controllers/credit_card_controller.rb + Views: app/views/credit_card/debit.html.erb [...] + Helper: app/helpers/credit_card_helper.rb + Test: test/functional/credit_card_controller_test.rb + +Modules Example: + `./script/generate controller 'admin/credit_card' suspend late_fee` + + Credit card admin controller with URLs /admin/credit_card/suspend. + Controller: app/controllers/admin/credit_card_controller.rb + Views: app/views/admin/credit_card/debit.html.erb [...] + Helper: app/helpers/admin/credit_card_helper.rb + Test: test/functional/admin/credit_card_controller_test.rb +------------------------------------------------------ + +Ah, the controller generator is expecting parameters in the form of `generate controller ControllerName action1 action2`. Let's make a `Greetings` controller with an action of *hello*, which will say something nice to us. + +[source,shell] +------------------------------------------------------ +$ ./script/generate controller Greeting hello + exists app/controllers/ + exists app/helpers/ + create app/views/greeting + exists test/functional/ + create app/controllers/greetings_controller.rb + create test/functional/greetings_controller_test.rb + create app/helpers/greetings_helper.rb + create app/views/greetings/hello.html.erb +------------------------------------------------------ + +Look there! Now what all did this generate? It looks like it made sure a bunch of directories were in our application, and created a controller file, a functional test file, a helper for the view, and a view file. All from one command! + -- cgit v1.2.3