/cmsify

Primary LanguageJavaScriptMIT LicenseMIT

Cmsify

This is a work in progress. Most of the functionalities haven't been implemented yet.

Getting started

Add the gem to your gemfile:

gem cmsify
$ bundle

Mount the api endpoints in your routes.rb file:

Rails.application.routes.draw do
  mount Cmsify::Engine => "/cmsify"
end

Add the js and css dependencies to your manifests:

in your js manifest, add:

//= require cmsify/dependencies/all
//= require cmsify/cmsify

in your css manifest, add:

*= require cmsify/cmsify

Ideally you should load those css and js dependencies only for users with administration abilities (you don't want to load useless javascript for users who don't have administration rights).

(Note that for your convenience we've put all the dependencies in the manifest "cmsify/dependencies/all". Those dependencies include: angular, ng-upload-file, angular-xeditable. If your application already uses angular, please see: How to integrate cmsify with an existing angular application)

The last thing you need to do is to pass a procedure in the cmsify config to determine if a user has administration abilities. If you use devise/warden, this should look something like this (config/initializers/cmsify.rb):

Cmsify.configure do |config|
  config.can_update = Proc.new do |request|
    current_user = request.env['warden'].user
    current_user.try(:has_role?, :content_admin)
  end
end

That's it! Now you can make any field of your rails models editable at a glance.

If you view looked something like this:

<h1>Last article:</h1>
<p><%= Article.last.body %></p>

All you need to make that field editable is:

<h1>Last article:</h1>
<p><%= abc object: Article.last, field: :body %></p>

and to whitelist that field by adding it to the list of editable fields in the cmsify config file:

Cmsify.configure do |config|
  ...
  config.fields = {
    Article: {
      body: true
    }
  }
end

Advanced config

Cmsify.configure do |config|
  config.white = {
    Shoes => {
      model: true,
      price_cents: true,
      currency: true
    },
    Location => {
      street_address: true,
      city: true,
      postcode: true,
      country_code: true
    },
    ...
  }
end

Edit a decorated field

The Shoe model has a "price_cents" field an a "currency" field which are used by a helper from the Money gem.

  <p>price: <%= @shoe.price.format %></p>

To make that field editable, first let's create a helper that chains those two methods (you can create that within a decorator class, in a helper module or even in the model class itself):

def formated_price
  self.price.format
end
<p>price: <%=abc object: @shoe, field: :formated_price %></p>

and define a setter in your cmsify config:

Cmsify.configure do |config|
  config.white = {
    Shoes => {
      formated_price: {
        setter: -> (ar, raw_value) { ar.price = raw_value.to_money }
        # raw_value.to_money will return a Money object and the setter :price= is defined by the money-rails gem
      }
    }
  }
end

To persist the modified content received by the api, cmsify calls the setter method defined for that field. If no setter method was defined, then the default one is called (if the field name is :title, the setter that will be called is :title=)

Refine a decorated editable field into other editable fields

We have a decorator called '#full_address' on our Location model:

def full_address
  "#{street_address}, #{city}, #{postcode}.<br>#{country_code}".html_safe
end

We can refine that field into editable fields:

<p>Address:</p>
<p>
  <%=abc object: @shoe.location, field: :full_address do %>
    <%=abc object: @shoe.location, field: :street_address %>  
    <%=abc object: @shoe.location, field: :city %>  
    <%=abc object: @shoe.location, field: :postcode %>  
    <%=abc object: @shoe.location, field: :country_code %>  
  <% end %>
</p>
Cmsify.configure do |config|
  config.white = {
    Location => {
      full_address: true,
      street_address: true,
      city: true,
      postcode: true,
      country_code: true
    }
  }
end

Generic placeholder

Cmsify comes with generic models for text and images. That can be useful to make static content, that changes quite often, editable. As an example, let's image that your home page looks something like this:

<h1>Red shoe on sales this week!</h1>
<p>blablabla</p>

That promo message has to change quite often but is not saved in any model. You can use the same :abc helper by providing a unique slug like so:

<h1><%= abc slug: :promo_message_homepage %></h1>
<p>blablabla</p>

You can know easily edit that field. This will be saved in the Cmsify::Text model. All you need to do to use those generic models is to:

Install the migrations:

$ rake cmsify:install:migrations

and run them:

$ rake db:migrate

Copyrights

This project rocks and uses MIT-LICENSE.