README.md in cambium-0.3.0 vs README.md in cambium-1.0.0
- old
+ new
@@ -1,31 +1,355 @@
-# Cambium
+Cambium
+==========
-Cambium speeds up app development to keep you focusing on business logic and not
-worrying about repetitive tasks.
+Cambium serves three main purposes in Ruby on Rails applications:
-**Initial sprint in progress. Documentation will be provided when the gem is
-ready for distribution.**
+1. Bootstrap Rails' standard installation by performing additional setup
+ (things I find myself doing at the beginning of every project).
+2. Facilitate development throughout the life of any project by abstracting
+ repeatable bits of code.
+3. Provide a simple, but flexible CMS for those applications that require it.
-## Installation
+For now, the documentation will be continued in the README. This will be moved
+out over time.
-Add this line to your application's Gemfile:
+App Setup
+----------
- gem 'cambium'
+Cambium lets you get up and running real fast. First, start you rails project
+as you normally would.
-And then execute:
+```text
+$ rails new my_app -d postgresql
+```
- $ bundle
+> Note: Cambium only supports PostgreSQL. If you need to use another database,
+> I suggest you add an option into Cambium and create a pull request. However,
+> I strongly encourage you to give PostgreSQL a try.
-Or install it yourself as:
+Add Cambium to your Gemfile.
- $ gem install cambium
+```ruby
+gem 'cambium', '>= 1.0.0'
+```
-## Usage
+> I would probably commit at this time (so it's easy to rollback if you don't
+> like something Cambium did).
-TODO: Write usage instructions here
+Generate Cambium's (simple) configuration file.
-## Contributing
+```text
+$ bundle exec rails g cambium:install
+```
+
+Edit the config (config/initializers/cambium.rb) to your liking.
+
+Then, get your PostgreSQL database configured by editing `config/database.yml`
+to your appropriate settings.
+
+> **Make sure you do not commit between this step and finishing the setup
+> process.** Cambium will ignore this database.yml file, which is good, as it
+> may contain sensitive data.
+
+Then, create your database:
+
+```text
+$ bundle exec rake db:create
+```
+
+Although optional, I suggest you at least start with the default `Gemfile`.
+
+```text
+$ bundle exec rails g cambium:gemfile
+```
+
+Remove the gems you don't want and then bundle.
+
+```text
+$ bundle install
+```
+
+And now you can run Cambium's auto-setup generator.
+
+```text
+$ bundle exec rails g cambium:app
+```
+
+When you're done, you can migrate (and annotate), and be on your way!
+
+```text
+$ bundle exec rake db:migrate
+$ bundle exec annotate
+```
+
+Admin / CMS
+----------
+
+### Install CMS
+
+If you want to also setup a CMS, it's as simple as running the generator.
+
+```text
+$ bundle exec rails g cambium:admin
+```
+
+Run the migrations Cambium created with the admin generator.
+
+```text
+$ bundle exec rake db:migrate
+$ bundle exec annotate
+```
+
+Make sure Cambium's engine is mounted in your `config/routes.rb` file.
+
+```ruby
+mount Cambium::Engine => '/'
+```
+
+It's best to mount it at the root because Cambium automatically namespaces its
+routes.
+
+At this point, you should be able to go to `localhost:3000/admin` and be
+redirected to the login page (if you are not signed in). Once you have an admin
+user and sign in successfully, you will be redirected to the admin dashboard.
+
+### Adding Users
+
+We have a generator for creating a new user, which takes an `--admin` option if
+you want the user to have admin access.
+
+```text
+$ bundle exec rails g cambium:user [username] [password] [--admin / --no-admin]
+```
+
+### Generating Admin Controllers
+
+A big portion of Cambium's power lies in its ability to spin up feature-full
+CMS controllers and views in a snap.
+
+Before you generate an admin controller, you need to make sure you have a
+working data model. It's best if the model already has the columns you know
+you're going to need (it's easy to add or remove later, but quicker if you have
+what you need at the beginning).
+
+Then you can run the generator.
+
+```text
+$ bundle exec rails g cambium:controller [model]
+```
+
+**Be sure you are using the proper class name of the data model.**
+
+For example, if I have a `Page` model, this would be the command:
+
+```text
+$ bundle exec rails g cambium:controller Page
+```
+
+> Note: I'm working on making Cambium more powerful all the time. At the
+> moment, it works best with simple form-type data.
+
+The generator does a few things:
+
+* Uses the standard Rails generate to generate a template in the `admin`
+ namespace (using the example, your file would be at
+ `app/controllers/admin/pages_controller.rb`).
+* Adds a namespaced route to your routes file (`config/routes.rb`).
+* Adds the Cambium config file (at `config/admin/pages.yml` in this example).
+* Adds a generic sidebar item for your controller at
+ `config/admin/sidebar.yml`.
+
+See below for information on the sidebar and controller settings.
+
+### Sidebar Settings
+
+The sidebar in Cambium is driven by your `config/admin/sidebar.yml` settings
+file. It's pretty semantic and simple.
+
+The default sidebar is:
+
+```yaml
+dashboard:
+ label: Dashboard
+ route: cambium.admin_dashboard
+ icon: dashboard
+users:
+ label: Users
+ route: cambium.admin_users
+ icon: users
+ controllers: ['users']
+```
+
+The important thing to remember is you have to define a unique key for each
+item. For example, if you accidentally named `users` as `dashboard`, then only
+the last `dashboard` item gets rendered.
+
+The options are:
+
+* `label`: Text within the sidebar link
+* `route`: Route to apply to the link (for custom settings, replace `cambium`
+ with `main_app`)
+* `icon`: The name of the icon to use, pulled from [IcoMoon's free
+ set](https://icomoon.io/#preview-free)
+* `controllers`: An array of controllers which, if the current page is using
+ one of the controllers, the sidebar item will be highlighted (with an
+ `active` class)
+
+### Controller Settings
+
+The controller settings are what drive the behavior of Cambium. And it's why,
+for simple models, you don't have to add any code to your controller and you
+don't need any views.
+
+Each controller's settings file is named for that controller, and can be found
+in `config/admin`. For example, the users controller settings are at
+`config/admin/users.yml`.
+
+Here is the default set for the users controller:
+
+```yaml
+model: User
+table:
+ title: Site Users
+ scope: all
+ columns:
+ email:
+ heading: Email
+ buttons:
+ new: New User
+export:
+ button: Export Users
+ columns:
+ name:
+ label: Name
+ email:
+ label: Email
+form:
+ new: &new
+ title: New User
+ fields:
+ name:
+ type: string
+ email:
+ type: string
+ password:
+ type: password
+ password_confirmation:
+ type: password
+ edit:
+ <<: *new
+ title: Edit User
+```
+
+Every setting plays a role. Let's step through each one.
+
+* `model`: The name (with class case) of the model to be used for this
+ controller
+* `table:title`: The title to show on the controller's index view.
+* `table:scope`: The scope method to run on the model. Most of the time this
+ will be `all`, but maybe you need to order, limit, or filter your results.
+ You need to do this through an [ActiveRecord
+ Scope](http://guides.rubyonrails.org/active_record_querying.html)
+* `table:columns:[column]`: Each column gets its own unique key, which
+ distinguishes it from others
+* `table:columns:[column]:heading`: The label for the column in the data table.
+* `table:buttons:new`: Label for the "New" button. If you don't want a
+ new button, remove this setting.
+* `export`: This section handles an export option for your data table. Remove
+ it if you don't want to offer that.
+* `export:button`: The label for the export button.
+* `export:columns:[column]`: Each column in the exported file gets its own
+ unique key, which distinguishes it from others
+* `export:columns:[column]:label`: The heading in the exported file for that
+ column.
+* `export:columns:[column]:output`: An optional method you can pass to each
+ object to help with display.
+* `form`: Settings for the form.
+* `form:[new/edit]`: New is the defaut, and most of the time Edit will inherit
+ from new (the `<<: *new` is what handles that). But you can optionally
+ override new values for your edit form.
+* `form:[new/edit]:title`: Title for the form page.
+* `form:[new/edit]:fields:[field]`: Each form field gets its own unique key to
+ set it apart from the others.
+* `form:[new/edit]:fields:[field]:type`: The type of the HTML field to render,
+ which uses [SimpleForm](https://github.com/plataformatec/simple_form).
+
+> Note: Aside from the usual form field types, Cambium uses [Mark It
+> Zero!](https://github.com/seancdavis/mark_it_zero) to render markdown
+> editors. You can pass `markdown` as the `type` option and it will give you a
+> markdown editor.
+
+Model Options
+----------
+
+Cambium makes use of many gems, and uses the behavior of those gems to drive
+much of its power. In many cases, this requires added options to your model.
+
+### Searchable Models
+
+To make items searchable (in the CMS and in the app), we use
+[pg_search](https://github.com/Casecommons/pg_search). You need to include the
+`PgSearch` module, and then call out the columns you want to search.
+
+For example, if you have a `Page` model and you want `title` and `body` to be
+searchable, you're model might look like this:
+
+```ruby
+class Page < ActiveRecord::Base
+ include PgSearch
+ multisearchable :against => [:title, :body]
+end
+```
+
+### Activity Log
+
+If you want to track the history of a model's records (which also means adding
+it to the activity log in the CMS), you need to add `has_paper_trail` to your
+model.
+
+```ruby
+class Page < ActiveRecord::Base
+ has_paper_trail
+end
+```
+
+The activity log in particular makes use of the `to_s` method for the model. In
+this way, we make no assumptions about the default attribute that describes a
+model's record. Usually this is something like `title` or `name`. If it were
+`title`, then your model (from above) is:
+
+```ruby
+class Page < ActiveRecord::Base
+ has_paper_trail
+
+ def to_s
+ title
+ end
+end
+```
+
+### Markdown to HTML
+
+As mentioned above, Cambium uses [Mark It
+Zero!](https://github.com/seancdavis/mark_it_zero) to render markdown editors.
+You, therefore, also have the option to store a markdown text attribute and
+have it automatically converted to HTML using the `after_save` callback.
+
+If, for our `Page` example, you have `body_markdown` and `body_html` fields,
+you can add your `body_markdown` attribute to the form and then the following
+to your model:
+
+```ruby
+class Page < ActiveRecord::Base
+ converts_markdown :body_markdown, :body_html
+end
+```
+
+See [this section](https://github.com/seancdavis/mark_it_zero#converting-to-
+html) of the Mark It Zero! docs for more information and options.
+
+Contributing
+----------
1. Fork it ( https://github.com/[my-github-username]/cambium/fork )
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)