Alchemy::Custom::Model [WIP]

Short description and motivation.


How to use my plugin.


Add this line to your application's Gemfile:

gem 'alchemy-custom-model'

And then execute:

$ bundle

Or install it yourself as:

$ gem install alchemy-custom-model

Then run the installer

bin/rails  alchemy_custom_model:install


  • Generate your model

    • remember to append a column for language: ruby t.integer :language_id
    • if this model would have a custom url and the relative layout, go to the friendly_id page to make the correct install
    • we can define on the model this attributes to be used for page SEO:
    • text :meta_description
    • text :meta_keywords
    • string :meta_title
    • boolean :robot_follow
    • boolean :robot_index
  • include the model decorator

     include Alchemy::Custom::Model::ModelDecoration
* attach yours belongs_to relations to alchemy_elements

    # For attachments, the foreign_key is the key defined in the model, can be omitted if it's standard Rails naming
    belongs_to :file, class_name: "Alchemy::Attachment", optional: true, foreign_key: :file_id
    global_id_setter :file

    # For Pictures
    belongs_to :picture, class_name: 'Alchemy::Picture', optional: true, touch: true
    global_id_setter :picture
  • Generate your controller: ruby bin/rails g controller Admin::Posts
  • inherit from Alchemy::Custom::Model::Admin::BaseController
  • Create the routes (prepend it to alchemy routes and alchemy_custom_model routes)
  • Build the ability for your recipe:

    class PostAbility
    include CanCan::Ability
    def initialize(user)
      if user.present? && (user.is_admin? or user.has_role?("editor"))
        can :manage, Post #model
        can :manage, :admin_posts #routes to the posts withouth _path


* build the abilities in ad initializer Es: "menu_and_abilities.rb"
                                         name: 'Posts', # custom name
                                         order: 2,
                                         navigation: {
                                             name: 'modules.posts',
                                             controller: '/admin/posts', #controller path
                                             action: 'index', #action
                                             icon: "question" # custom icon
  • Costruisci la form per il modello ```ruby

<%= base_form_container do %>

<%= simple_form_for [:admin,@obj] do |f| %>

    <%= f.input :name %>
    <%= rich_text_editor(f, :description) %>
    <%= single_image_input(f, :picture) %>
    <%= single_attachment_input(f, :file) %>


* Per elementi come subobject seguire l'esempio di codice nei test che rivedono le varie opzioni
* Per modelli che si legano direttamente con componenti di alchemy รจ necessario utilizzare delle relazioni generiche che identificato il record:
  belongs_to :picture, class_name: 'Alchemy::Picture', touch: true
  belongs_to :alchemy_file_instance, class_name: 'Alchemy::Picture', foreign_key: :picture_id #relazione generica per i files utilizzata nel volume di elfinder
  • Per la visualizzazione creare quindi un layout in Alchemy con attributi custom_model e custom_model_action che serve per identificare la generazione dei link index e show ```yml - name: layout_name_list elements: [element_for_list] custom_model: "CustomModelClass" custom_model_action: "index" cache: false
  • name: layout_name_show elements: [element_for_show] custom_model: "CustomModelClass" custom_model_action: "show" cache: false ```
    * E' necessario quindi creare le due pagine nella struttura di alchemy


git clone --recursive

docker build -t alchemy_custom_image .

docker run -it -p3000:3000 --rm -v "$(pwd)":/app alchemy_custom_image bin/rails s -b


The gem is available as open source under the terms of the MIT License.