35
RailsAdmin Overview & Best practices mercredi 7 août 13

RailsAdmin - Overview and Best practices

Embed Size (px)

DESCRIPTION

RailsAdmin presentation for the parisrb meetup. Overview, best practices, comparison with ActiveAdmin, capybara steps for testing, cancan integration,

Citation preview

Page 1: RailsAdmin - Overview and Best practices

RailsAdminOverview & Best practices

mercredi 7 août 13

Page 2: RailsAdmin - Overview and Best practices

14 years agoAcceptable in the 90’

mercredi 7 août 13

Page 3: RailsAdmin - Overview and Best practices

Data Admin, stand-alone

• + Pros

• Reliable

• Powerful

• - Cons

• No business rules whatsoever

mercredi 7 août 13

Page 4: RailsAdmin - Overview and Best practices

mercredi 7 août 13

Page 5: RailsAdmin - Overview and Best practices

Data Admin, in the application

• + Pros

• Leverages the whole application or some parts for business rules etc.

• - Cons

• No direct (fast) DB administration

• Your code?

In theory...

mercredi 7 août 13

Page 6: RailsAdmin - Overview and Best practices

• Admin generator

• Immediate startup

• Steep learning curve

• Extensible

• Powerful when leverages Rails Models and Cancan

• Admin builder

• Slower startup

• Simple DSL

• Usable

• Good for ad-hoc admin building when Models/Cancan rules don’t infer the UI

RailsAdmin ActiveAdmin

Grain of salt, common sense, etc.

mercredi 7 août 13

Page 7: RailsAdmin - Overview and Best practices

Pitfall

• ActiveAdmin lets you do the work

• => with some help from Formtastic :/

• RailsAdmin shortcuts ActiveModel

• => Complex custom code laying on the ORMs :/

• But hey! it works®*

ActiveModel does not provide anything for associations!

* Unless you screwed up your models associations definitions

mercredi 7 août 13

Page 8: RailsAdmin - Overview and Best practices

Minimum installation

• rails new new_app

• rails g model blog::post title:string content:text

• rails g model blog::comment content:text post:belongs_to

• gem ‘rails_admin’

• mount RailsAdmin::Engine => ‘’

mercredi 7 août 13

Page 9: RailsAdmin - Overview and Best practices

Big picture

• Actions

• Map routing to templates and controller

• Sections

• Map field configuration to each action

• Fields

• Handle fields configurations

mercredi 7 août 13

Page 10: RailsAdmin - Overview and Best practices

Actions-Sections CRUD mapping

• new => new < edit < base

• edit => update < edit < base

• edit/new nested => nested < edit < base

• edit/new modal => modal < edit < base

• index => list < base

• export => export < base

mercredi 7 août 13

Page 11: RailsAdmin - Overview and Best practices

Example

mercredi 7 août 13

Page 12: RailsAdmin - Overview and Best practices

The issue...

• Never-ending list of section/fields definitions

mercredi 7 août 13

Page 13: RailsAdmin - Overview and Best practices

Solutions

• Use configure as much as you can (doesn’t force the field list in opt-in mode)

• Use order

• Move each model configuration to a rails_admin block in class definition

• Hide fields you don’t need instead of listing them (less overhead usually)

mercredi 7 août 13

Page 14: RailsAdmin - Overview and Best practices

Associations

mercredi 7 août 13

Page 15: RailsAdmin - Overview and Best practices

The associations

• has_many => nested

• has_one => nested

• belongs_to => modal

• has_many :through => modal

• has_and_belong_to_many => modal

• It makes sense®

mercredi 7 août 13

Page 16: RailsAdmin - Overview and Best practices

Back to our models...

mercredi 7 août 13

Page 17: RailsAdmin - Overview and Best practices

You tell your ORM about it

mercredi 7 août 13

Page 18: RailsAdmin - Overview and Best practices

Stay on the Golden path

• Convention over configuration!

• RailsAdmin gets as much intel as it can from your models:

• Fields

• Associations

• Validations

• Don’t configure RailsAdmin when you can tweak your app to Rails’ best standards!

mercredi 7 août 13

Page 19: RailsAdmin - Overview and Best practices

But wait! Admin! Passwords and stuff!

• gem ‘devise’

• rails g devise:install

• rails g devise user

• rails g migration add_user_id_to_blog_posts user:belongs_to

• config/rails_admin.rb:

mercredi 7 août 13

Page 20: RailsAdmin - Overview and Best practices

Who am I?

mercredi 7 août 13

Page 21: RailsAdmin - Overview and Best practices

This is called authentication.Do you have authorization?• gem ‘cancan’

• rails g migration add_profile_to_users profile:string

• config/rails_admin.rb:

• rails g cancan:ability

mercredi 7 août 13

Page 22: RailsAdmin - Overview and Best practices

Some other profiles

• Admin can do anything

• Writer can

• access rails_admin

• access the dashboard

• CRUD Blog::Post that he owns

• for new posts, user_id will be forced to his id

mercredi 7 août 13

Page 23: RailsAdmin - Overview and Best practices

Ok, what do I get for my writers ?

mercredi 7 août 13

Page 24: RailsAdmin - Overview and Best practices

At last, some RailsAdmin field configuration!

mercredi 7 août 13

Page 25: RailsAdmin - Overview and Best practices

Deal with serialized fields

• rails g migration add_metadata_to_blog_posts metadata:text

• models/blog/post.rb

mercredi 7 août 13

Page 26: RailsAdmin - Overview and Best practices

Now what?

• It’s error prone :(

• It’s ugly :(

• It’s not user friendly :(

• It’s dangerous :(

• What should I do?

mercredi 7 août 13

Page 27: RailsAdmin - Overview and Best practices

Use some ‘virtual’ fields?

• You don’t need your object to respond to ‘block’ !

• You can create RailsAdmin fields out of the blue

• You just need to define value and parse_input methods (in & out the form)

• allowed_methods lets you modify the mass-assignable params on the object (safety)

mercredi 7 août 13

Page 28: RailsAdmin - Overview and Best practices

Say I need another one like ‘block’?

• Let’s create a metadata RailsAdmin field type, in our application

• lib/rails_admin/metadata.rb

mercredi 7 août 13

Page 29: RailsAdmin - Overview and Best practices

Time to leverage

No pollution in the model!

mercredi 7 août 13

Page 30: RailsAdmin - Overview and Best practices

Some actions?

mercredi 7 août 13

Page 31: RailsAdmin - Overview and Best practices

I need to publish my posts!

Define an action, then use it

mercredi 7 août 13

Page 32: RailsAdmin - Overview and Best practices

Then the view part, simple stuff

The view goes to rails_admin/main/publish.slim

Then add some translations for proper integration

mercredi 7 août 13

Page 33: RailsAdmin - Overview and Best practices

I’m in trouble

• Check that your models are ok (rails c)

• bundle open rails_admin

• trace @abstract_model, @object in actions

• trace @abstract_model, bindings[:object] in fields

mercredi 7 août 13

Page 34: RailsAdmin - Overview and Best practices

Someone said I need tests, I probably need tests, did I say I need tests?

https://github.com/sferik/rails_admin/wiki/Rspec-with-capybara-examples

mercredi 7 août 13

Page 35: RailsAdmin - Overview and Best practices

Thanks for listening!Full example code

https://github.com/bbenezech/blog_admin

[email protected]

@bbenezech github/Skype/twitter

Freelance

mercredi 7 août 13