Repository files navigation

Tandem is a content management system (CMS) for Rails 3.1+. We felt like it was needed because too many of the CMS options for Rails are either unpolished—something we wouldn’t want to put in front of our clients or bloated and heavy, causing many headaches when trying to integrate into existing applications.

Tandem was designed to be as simple as can be to integrate into a larger application. It’s a mountable engine that allows you to easily specify how it fits into a larger application and doesn’t bring any opinions about how that application is architected.

The simplicity doesn’t stop there, though. It also has the end user in mind. Through in-place editing, users simply navigate their site like they normally would. If they want to edit something, they simply click on it, edit it, and go on their merry way.

It’s early in the life of Tandem and we have lots in store, but it’s something we find useful and hope you will too.

Has it ever been easier to check off that “CMS functionality” feature story?

This assumes you have a rails app already. If you don’t, rails new tandem_app

  1. Add the tandem gem to your Gemfile

    gem'tandem'
  2. Install the gem

    bundleinstall
  3. Generate the tandem files

    railsgtandem
  4. Migrate

    rakedb:migrate
  5. Start your app and you’re ready to go.

    railss

Upgrade just like you would any other engine.

  1. Update the gem version to the latest version in your gemfile if you specify a version.

    gem'tandem', '~> 0.2'
  2. Install the updated gem

    bundleupdatetandem
  3. Copy any new migrations from tandem

    rake tandem:install:migrations
  4. Migrate

    rakedb:migrate
  5. Enjoy the new tandem goodness.

    railss

By default, Tandem uses your application layout and Tandem’s pages/show template to render pages. Both of these can be customized for an individual page.

With Tandem, you can easily insert editable content into your page by using the simple helpers, tandem_text_tag and tandem_image_tag.

Simply insert those into your templates where you want the user to be able to edit content and Tandem will take care of the rest.

<div id="sidebar">
<%= tandem_image_tag(:sidebar_image)
<%= tandem_text_tag(:sidebar_text)
</div>

The tandem_text_tag defaults to a basic text area. If you’d like to offer a WYSIWYG editor, you can set the editor option to :wysiwyg:

<%= tandem_text_tag(:sidebar_text, editor: :wysiwyg) %>

Tandem comes with a helper method to add a navigation menu. It’s not included in the default views, since it will most likely be used in your app’s application layout. Adding it is easy, though.

<%= tandem_navigation_tag(@page) %>

By default, Tandem will produce a nested tree of all your pages. If you just want the top level:

<%= tandem_navigation_tag(@page, Tandem::Page.top_level) %>

If you want to show just the subnavication for a given page:

<%= tandem_navigation_tag(@page, @page.children) %>

You can also create submenus easily by passing in a custom collection of pages, e.g.

<%= tandem_navigation_tag(@page, Tandem::Page.find_by_title('Services').children) %>

Now, most apps don’t simply want to let anyone edit content. Tandem allows you to easily specify how it should control access.

Inside config/initializers/tandem.rb, you can define procs for Tandem to use for authentication and authorization.

  1. Tell Tandem how to find the current_user

    Tandem::Configuration.current_user_proc { |request|User.find(request.session['user_id']) unlessrequest.session['user_id'].blank?
    }
    
  2. Define what each user can do using CanCan

    Tandem::Configuration.user_abilities_proc { |user|user||=User.new# guest user (not logged in)ifuser.admin?can:manage, :allelsecan:read, :allend
    }
    

Tandem uses paperclip for file uploads. If your application needs to modify its settings, simply set the Tandem::Configuration.paperclip_options in /config/initializers/tandem.rb

For example, to store images on S3, add the aws-sdk gem to your Gemfile and set paperclip_options to:

Tandem::Configuration.paperclip_options = { :styles=> { :thumb=>"150x150>" },
:storage=>:s3,
:bucket=>Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
:s3_credentials=> {
:access_key_id=>ENV['S3_KEY'],
:secret_access_key=>ENV['S3_SECRET']
} }

By default, Tandem mounts to the root of your application. We’re not trying to be pushy, it’s just what we find ourselves doing 90% of the time. To change this, simply modify your config/routes.rb to something like:

mountTandem::Engine=>"/tandem"

To change the url that you wish to serve unauthorized access errors supply a value to:

Tandem::Configuration.unauthorized_path

By default, the tandem generator copies all tandem layouts to app/views/layouts/tandem. If you wish to move your layouts to another location, supply a value to:

Tandem::Configuration.layouts_dir

By default, the uploaded images directly in the asset pipeline at :rails_root/public. To change this location, supply a value to:

Tandem::Configuration.uploaded_images_dir

By default, the uploaded images are stored and accessed via the default “paperclip” conventions (see paperclip gem). To change this behavior, supply a value to:

Tandem::Configuration.uploaded_images_template

Every new Tandem default page created has pre-defined classes setup to use either Bootstrap or 960.gs.

Here’s a preview of what the html looks like:

.container_12.row.clearfix
p#notice = notice
.grid_12.span12
= tandem_image_tag(@page, :default_image)
.grid_7.span7
= tandem_text_tag(@page, :tandem_text_block)
.grid_5.span5
= tandem_text_tag(@page, :tandem_sidebar)

If either of those grid systems are being used those styles will pull in accordingly.

  1. Fork it.

  2. Create a branch (git checkout -b my_markup)

  3. Commit your changes (git commit -am “Added Snarkdown”)

  4. Push to the branch (git push origin my_markup)

  5. Open a Pull Request

We are big believers in testing, so every pull request needs to be tested.

  1. Run Bundle

    bundleinstall
  2. Create the Database

    rakedb:create
  3. Run the Migrations

    rakedb:migrate
  4. Prepare the Test Database

    rake app:db:test:prepare
  5. See all the Green.

    rake

Tandem is released under the MIT license:

About

A simple Rails plugin that brings basic CMS functionality to any app. Just drop it in and go.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Tandem is a content management system (CMS) for Rails 3.1+. We felt like it was needed because too many of the CMS options for Rails are either unpolished—something we wouldn’t want to put in front of our clients or bloated and heavy, causing many headaches when trying to integrate into existing applications.

Tandem was designed to be as simple as can be to integrate into a larger application. It’s a mountable engine that allows you to easily specify how it fits into a larger application and doesn’t bring any opinions about how that application is architected.

The simplicity doesn’t stop there, though. It also has the end user in mind. Through in-place editing, users simply navigate their site like they normally would. If they want to edit something, they simply click on it, edit it, and go on their merry way.

It’s early in the life of Tandem and we have lots in store, but it’s something we find useful and hope you will too.

Has it ever been easier to check off that “CMS functionality” feature story?

This assumes you have a rails app already. If you don’t, rails new tandem_app

  1. Add the tandem gem to your Gemfile

    gem'tandem'
  2. Install the gem

    bundleinstall
  3. Generate the tandem files

    railsgtandem
  4. Migrate

    rakedb:migrate
  5. Start your app and you’re ready to go.

    railss

Upgrade just like you would any other engine.

  1. Update the gem version to the latest version in your gemfile if you specify a version.

    gem'tandem', '~> 0.2'
  2. Install the updated gem

    bundleupdatetandem
  3. Copy any new migrations from tandem

    rake tandem:install:migrations
  4. Migrate

    rakedb:migrate
  5. Enjoy the new tandem goodness.

    railss

By default, Tandem uses your application layout and Tandem’s pages/show template to render pages. Both of these can be customized for an individual page.

With Tandem, you can easily insert editable content into your page by using the simple helpers, tandem_text_tag and tandem_image_tag.

Simply insert those into your templates where you want the user to be able to edit content and Tandem will take care of the rest.

<div id="sidebar">
<%= tandem_image_tag(:sidebar_image)
<%= tandem_text_tag(:sidebar_text)
</div>

The tandem_text_tag defaults to a basic text area. If you’d like to offer a WYSIWYG editor, you can set the editor option to :wysiwyg:

<%= tandem_text_tag(:sidebar_text, editor: :wysiwyg) %>

Tandem comes with a helper method to add a navigation menu. It’s not included in the default views, since it will most likely be used in your app’s application layout. Adding it is easy, though.

<%= tandem_navigation_tag(@page) %>

By default, Tandem will produce a nested tree of all your pages. If you just want the top level:

<%= tandem_navigation_tag(@page, Tandem::Page.top_level) %>

If you want to show just the subnavication for a given page:

<%= tandem_navigation_tag(@page, @page.children) %>

You can also create submenus easily by passing in a custom collection of pages, e.g.

<%= tandem_navigation_tag(@page, Tandem::Page.find_by_title('Services').children) %>

Now, most apps don’t simply want to let anyone edit content. Tandem allows you to easily specify how it should control access.

Inside config/initializers/tandem.rb, you can define procs for Tandem to use for authentication and authorization.

  1. Tell Tandem how to find the current_user

    Tandem::Configuration.current_user_proc { |request|User.find(request.session['user_id']) unlessrequest.session['user_id'].blank?
    }
    
  2. Define what each user can do using CanCan

    Tandem::Configuration.user_abilities_proc { |user|user||=User.new# guest user (not logged in)ifuser.admin?can:manage, :allelsecan:read, :allend
    }
    

Tandem uses paperclip for file uploads. If your application needs to modify its settings, simply set the Tandem::Configuration.paperclip_options in /config/initializers/tandem.rb

For example, to store images on S3, add the aws-sdk gem to your Gemfile and set paperclip_options to:

Tandem::Configuration.paperclip_options = { :styles=> { :thumb=>"150x150>" },
:storage=>:s3,
:bucket=>Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
:s3_credentials=> {
:access_key_id=>ENV['S3_KEY'],
:secret_access_key=>ENV['S3_SECRET']
} }

By default, Tandem mounts to the root of your application. We’re not trying to be pushy, it’s just what we find ourselves doing 90% of the time. To change this, simply modify your config/routes.rb to something like:

mountTandem::Engine=>"/tandem"

To change the url that you wish to serve unauthorized access errors supply a value to:

Tandem::Configuration.unauthorized_path

By default, the tandem generator copies all tandem layouts to app/views/layouts/tandem. If you wish to move your layouts to another location, supply a value to:

Tandem::Configuration.layouts_dir

By default, the uploaded images directly in the asset pipeline at :rails_root/public. To change this location, supply a value to:

Tandem::Configuration.uploaded_images_dir

By default, the uploaded images are stored and accessed via the default “paperclip” conventions (see paperclip gem). To change this behavior, supply a value to:

Tandem::Configuration.uploaded_images_template

Every new Tandem default page created has pre-defined classes setup to use either Bootstrap or 960.gs.

Here’s a preview of what the html looks like:

.container_12.row.clearfix
p#notice = notice
.grid_12.span12
= tandem_image_tag(@page, :default_image)
.grid_7.span7
= tandem_text_tag(@page, :tandem_text_block)
.grid_5.span5
= tandem_text_tag(@page, :tandem_sidebar)

If either of those grid systems are being used those styles will pull in accordingly.

  1. Fork it.

  2. Create a branch (git checkout -b my_markup)

  3. Commit your changes (git commit -am “Added Snarkdown”)

  4. Push to the branch (git push origin my_markup)

  5. Open a Pull Request

We are big believers in testing, so every pull request needs to be tested.

  1. Run Bundle

    bundleinstall
  2. Create the Database

    rakedb:create
  3. Run the Migrations

    rakedb:migrate
  4. Prepare the Test Database

    rake app:db:test:prepare
  5. See all the Green.

    rake

Tandem is released under the MIT license:

About

A simple Rails plugin that brings basic CMS functionality to any app. Just drop it in and go.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Tandem is a content management system (CMS) for Rails 3.1+. We felt like it was needed because too many of the CMS options for Rails are either unpolished—something we wouldn’t want to put in front of our clients or bloated and heavy, causing many headaches when trying to integrate into existing applications.

Tandem was designed to be as simple as can be to integrate into a larger application. It’s a mountable engine that allows you to easily specify how it fits into a larger application and doesn’t bring any opinions about how that application is architected.

The simplicity doesn’t stop there, though. It also has the end user in mind. Through in-place editing, users simply navigate their site like they normally would. If they want to edit something, they simply click on it, edit it, and go on their merry way.

It’s early in the life of Tandem and we have lots in store, but it’s something we find useful and hope you will too.

Has it ever been easier to check off that “CMS functionality” feature story?

This assumes you have a rails app already. If you don’t, rails new tandem_app

  1. Add the tandem gem to your Gemfile

    gem'tandem'
  2. Install the gem

    bundleinstall
  3. Generate the tandem files

    railsgtandem
  4. Migrate

    rakedb:migrate
  5. Start your app and you’re ready to go.

    railss

Upgrade just like you would any other engine.

  1. Update the gem version to the latest version in your gemfile if you specify a version.

    gem'tandem', '~> 0.2'
  2. Install the updated gem

    bundleupdatetandem
  3. Copy any new migrations from tandem

    rake tandem:install:migrations
  4. Migrate

    rakedb:migrate
  5. Enjoy the new tandem goodness.

    railss

By default, Tandem uses your application layout and Tandem’s pages/show template to render pages. Both of these can be customized for an individual page.

With Tandem, you can easily insert editable content into your page by using the simple helpers, tandem_text_tag and tandem_image_tag.

Simply insert those into your templates where you want the user to be able to edit content and Tandem will take care of the rest.

<div id="sidebar">
<%= tandem_image_tag(:sidebar_image)
<%= tandem_text_tag(:sidebar_text)
</div>

The tandem_text_tag defaults to a basic text area. If you’d like to offer a WYSIWYG editor, you can set the editor option to :wysiwyg:

<%= tandem_text_tag(:sidebar_text, editor: :wysiwyg) %>

Tandem comes with a helper method to add a navigation menu. It’s not included in the default views, since it will most likely be used in your app’s application layout. Adding it is easy, though.

<%= tandem_navigation_tag(@page) %>

By default, Tandem will produce a nested tree of all your pages. If you just want the top level:

<%= tandem_navigation_tag(@page, Tandem::Page.top_level) %>

If you want to show just the subnavication for a given page:

<%= tandem_navigation_tag(@page, @page.children) %>

You can also create submenus easily by passing in a custom collection of pages, e.g.

<%= tandem_navigation_tag(@page, Tandem::Page.find_by_title('Services').children) %>

Now, most apps don’t simply want to let anyone edit content. Tandem allows you to easily specify how it should control access.

Inside config/initializers/tandem.rb, you can define procs for Tandem to use for authentication and authorization.

  1. Tell Tandem how to find the current_user

    Tandem::Configuration.current_user_proc { |request|User.find(request.session['user_id']) unlessrequest.session['user_id'].blank?
    }
    
  2. Define what each user can do using CanCan

    Tandem::Configuration.user_abilities_proc { |user|user||=User.new# guest user (not logged in)ifuser.admin?can:manage, :allelsecan:read, :allend
    }
    

Tandem uses paperclip for file uploads. If your application needs to modify its settings, simply set the Tandem::Configuration.paperclip_options in /config/initializers/tandem.rb

For example, to store images on S3, add the aws-sdk gem to your Gemfile and set paperclip_options to:

Tandem::Configuration.paperclip_options = { :styles=> { :thumb=>"150x150>" },
:storage=>:s3,
:bucket=>Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
:s3_credentials=> {
:access_key_id=>ENV['S3_KEY'],
:secret_access_key=>ENV['S3_SECRET']
} }

By default, Tandem mounts to the root of your application. We’re not trying to be pushy, it’s just what we find ourselves doing 90% of the time. To change this, simply modify your config/routes.rb to something like:

mountTandem::Engine=>"/tandem"

To change the url that you wish to serve unauthorized access errors supply a value to:

Tandem::Configuration.unauthorized_path

By default, the tandem generator copies all tandem layouts to app/views/layouts/tandem. If you wish to move your layouts to another location, supply a value to:

Tandem::Configuration.layouts_dir

By default, the uploaded images directly in the asset pipeline at :rails_root/public. To change this location, supply a value to:

Tandem::Configuration.uploaded_images_dir

By default, the uploaded images are stored and accessed via the default “paperclip” conventions (see paperclip gem). To change this behavior, supply a value to:

Tandem::Configuration.uploaded_images_template

Every new Tandem default page created has pre-defined classes setup to use either Bootstrap or 960.gs.

Here’s a preview of what the html looks like:

.container_12.row.clearfix
p#notice = notice
.grid_12.span12
= tandem_image_tag(@page, :default_image)
.grid_7.span7
= tandem_text_tag(@page, :tandem_text_block)
.grid_5.span5
= tandem_text_tag(@page, :tandem_sidebar)

If either of those grid systems are being used those styles will pull in accordingly.

  1. Fork it.

  2. Create a branch (git checkout -b my_markup)

  3. Commit your changes (git commit -am “Added Snarkdown”)

  4. Push to the branch (git push origin my_markup)

  5. Open a Pull Request

We are big believers in testing, so every pull request needs to be tested.

  1. Run Bundle

    bundleinstall
  2. Create the Database

    rakedb:create
  3. Run the Migrations

    rakedb:migrate
  4. Prepare the Test Database

    rake app:db:test:prepare
  5. See all the Green.

    rake

Tandem is released under the MIT license:

About

A simple Rails plugin that brings basic CMS functionality to any app. Just drop it in and go.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Tandem is a content management system (CMS) for Rails 3.1+. We felt like it was needed because too many of the CMS options for Rails are either unpolished—something we wouldn’t want to put in front of our clients or bloated and heavy, causing many headaches when trying to integrate into existing applications.

Tandem was designed to be as simple as can be to integrate into a larger application. It’s a mountable engine that allows you to easily specify how it fits into a larger application and doesn’t bring any opinions about how that application is architected.

The simplicity doesn’t stop there, though. It also has the end user in mind. Through in-place editing, users simply navigate their site like they normally would. If they want to edit something, they simply click on it, edit it, and go on their merry way.

It’s early in the life of Tandem and we have lots in store, but it’s something we find useful and hope you will too.

Has it ever been easier to check off that “CMS functionality” feature story?

This assumes you have a rails app already. If you don’t, rails new tandem_app

  1. Add the tandem gem to your Gemfile

    gem'tandem'
  2. Install the gem

    bundleinstall
  3. Generate the tandem files

    railsgtandem
  4. Migrate

    rakedb:migrate
  5. Start your app and you’re ready to go.

    railss

Upgrade just like you would any other engine.

  1. Update the gem version to the latest version in your gemfile if you specify a version.

    gem'tandem', '~> 0.2'
  2. Install the updated gem

    bundleupdatetandem
  3. Copy any new migrations from tandem

    rake tandem:install:migrations
  4. Migrate

    rakedb:migrate
  5. Enjoy the new tandem goodness.

    railss

By default, Tandem uses your application layout and Tandem’s pages/show template to render pages. Both of these can be customized for an individual page.

With Tandem, you can easily insert editable content into your page by using the simple helpers, tandem_text_tag and tandem_image_tag.

Simply insert those into your templates where you want the user to be able to edit content and Tandem will take care of the rest.

<div id="sidebar">
<%= tandem_image_tag(:sidebar_image)
<%= tandem_text_tag(:sidebar_text)
</div>

The tandem_text_tag defaults to a basic text area. If you’d like to offer a WYSIWYG editor, you can set the editor option to :wysiwyg:

<%= tandem_text_tag(:sidebar_text, editor: :wysiwyg) %>

Tandem comes with a helper method to add a navigation menu. It’s not included in the default views, since it will most likely be used in your app’s application layout. Adding it is easy, though.

<%= tandem_navigation_tag(@page) %>

By default, Tandem will produce a nested tree of all your pages. If you just want the top level:

<%= tandem_navigation_tag(@page, Tandem::Page.top_level) %>

If you want to show just the subnavication for a given page:

<%= tandem_navigation_tag(@page, @page.children) %>

You can also create submenus easily by passing in a custom collection of pages, e.g.

<%= tandem_navigation_tag(@page, Tandem::Page.find_by_title('Services').children) %>

Now, most apps don’t simply want to let anyone edit content. Tandem allows you to easily specify how it should control access.

Inside config/initializers/tandem.rb, you can define procs for Tandem to use for authentication and authorization.

  1. Tell Tandem how to find the current_user

    Tandem::Configuration.current_user_proc { |request|User.find(request.session['user_id']) unlessrequest.session['user_id'].blank?
    }
    
  2. Define what each user can do using CanCan

    Tandem::Configuration.user_abilities_proc { |user|user||=User.new# guest user (not logged in)ifuser.admin?can:manage, :allelsecan:read, :allend
    }
    

Tandem uses paperclip for file uploads. If your application needs to modify its settings, simply set the Tandem::Configuration.paperclip_options in /config/initializers/tandem.rb

For example, to store images on S3, add the aws-sdk gem to your Gemfile and set paperclip_options to:

Tandem::Configuration.paperclip_options = { :styles=> { :thumb=>"150x150>" },
:storage=>:s3,
:bucket=>Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
:s3_credentials=> {
:access_key_id=>ENV['S3_KEY'],
:secret_access_key=>ENV['S3_SECRET']
} }

By default, Tandem mounts to the root of your application. We’re not trying to be pushy, it’s just what we find ourselves doing 90% of the time. To change this, simply modify your config/routes.rb to something like:

mountTandem::Engine=>"/tandem"

To change the url that you wish to serve unauthorized access errors supply a value to:

Tandem::Configuration.unauthorized_path

By default, the tandem generator copies all tandem layouts to app/views/layouts/tandem. If you wish to move your layouts to another location, supply a value to:

Tandem::Configuration.layouts_dir

By default, the uploaded images directly in the asset pipeline at :rails_root/public. To change this location, supply a value to:

Tandem::Configuration.uploaded_images_dir

By default, the uploaded images are stored and accessed via the default “paperclip” conventions (see paperclip gem). To change this behavior, supply a value to:

Tandem::Configuration.uploaded_images_template

Every new Tandem default page created has pre-defined classes setup to use either Bootstrap or 960.gs.

Here’s a preview of what the html looks like:

.container_12.row.clearfix
p#notice = notice
.grid_12.span12
= tandem_image_tag(@page, :default_image)
.grid_7.span7
= tandem_text_tag(@page, :tandem_text_block)
.grid_5.span5
= tandem_text_tag(@page, :tandem_sidebar)

If either of those grid systems are being used those styles will pull in accordingly.

  1. Fork it.

  2. Create a branch (git checkout -b my_markup)

  3. Commit your changes (git commit -am “Added Snarkdown”)

  4. Push to the branch (git push origin my_markup)

  5. Open a Pull Request

We are big believers in testing, so every pull request needs to be tested.

  1. Run Bundle

    bundleinstall
  2. Create the Database

    rakedb:create
  3. Run the Migrations

    rakedb:migrate
  4. Prepare the Test Database

    rake app:db:test:prepare
  5. See all the Green.

    rake

Tandem is released under the MIT license:

About

A simple Rails plugin that brings basic CMS functionality to any app. Just drop it in and go.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Tandem is a content management system (CMS) for Rails 3.1+. We felt like it was needed because too many of the CMS options for Rails are either unpolished—something we wouldn’t want to put in front of our clients or bloated and heavy, causing many headaches when trying to integrate into existing applications.

Tandem was designed to be as simple as can be to integrate into a larger application. It’s a mountable engine that allows you to easily specify how it fits into a larger application and doesn’t bring any opinions about how that application is architected.

The simplicity doesn’t stop there, though. It also has the end user in mind. Through in-place editing, users simply navigate their site like they normally would. If they want to edit something, they simply click on it, edit it, and go on their merry way.

It’s early in the life of Tandem and we have lots in store, but it’s something we find useful and hope you will too.

Has it ever been easier to check off that “CMS functionality” feature story?

This assumes you have a rails app already. If you don’t, rails new tandem_app

  1. Add the tandem gem to your Gemfile

    gem'tandem'
  2. Install the gem

    bundleinstall
  3. Generate the tandem files

    railsgtandem
  4. Migrate

    rakedb:migrate
  5. Start your app and you’re ready to go.

    railss

Upgrade just like you would any other engine.

  1. Update the gem version to the latest version in your gemfile if you specify a version.

    gem'tandem', '~> 0.2'
  2. Install the updated gem

    bundleupdatetandem
  3. Copy any new migrations from tandem

    rake tandem:install:migrations
  4. Migrate

    rakedb:migrate
  5. Enjoy the new tandem goodness.

    railss

By default, Tandem uses your application layout and Tandem’s pages/show template to render pages. Both of these can be customized for an individual page.

With Tandem, you can easily insert editable content into your page by using the simple helpers, tandem_text_tag and tandem_image_tag.

Simply insert those into your templates where you want the user to be able to edit content and Tandem will take care of the rest.

<div id="sidebar">
<%= tandem_image_tag(:sidebar_image)
<%= tandem_text_tag(:sidebar_text)
</div>

The tandem_text_tag defaults to a basic text area. If you’d like to offer a WYSIWYG editor, you can set the editor option to :wysiwyg:

<%= tandem_text_tag(:sidebar_text, editor: :wysiwyg) %>

Tandem comes with a helper method to add a navigation menu. It’s not included in the default views, since it will most likely be used in your app’s application layout. Adding it is easy, though.

<%= tandem_navigation_tag(@page) %>

By default, Tandem will produce a nested tree of all your pages. If you just want the top level:

<%= tandem_navigation_tag(@page, Tandem::Page.top_level) %>

If you want to show just the subnavication for a given page:

<%= tandem_navigation_tag(@page, @page.children) %>

You can also create submenus easily by passing in a custom collection of pages, e.g.

<%= tandem_navigation_tag(@page, Tandem::Page.find_by_title('Services').children) %>

Now, most apps don’t simply want to let anyone edit content. Tandem allows you to easily specify how it should control access.

Inside config/initializers/tandem.rb, you can define procs for Tandem to use for authentication and authorization.

  1. Tell Tandem how to find the current_user

    Tandem::Configuration.current_user_proc { |request|User.find(request.session['user_id']) unlessrequest.session['user_id'].blank?
    }
    
  2. Define what each user can do using CanCan

    Tandem::Configuration.user_abilities_proc { |user|user||=User.new# guest user (not logged in)ifuser.admin?can:manage, :allelsecan:read, :allend
    }
    

Tandem uses paperclip for file uploads. If your application needs to modify its settings, simply set the Tandem::Configuration.paperclip_options in /config/initializers/tandem.rb

For example, to store images on S3, add the aws-sdk gem to your Gemfile and set paperclip_options to:

Tandem::Configuration.paperclip_options = { :styles=> { :thumb=>"150x150>" },
:storage=>:s3,
:bucket=>Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
:s3_credentials=> {
:access_key_id=>ENV['S3_KEY'],
:secret_access_key=>ENV['S3_SECRET']
} }

By default, Tandem mounts to the root of your application. We’re not trying to be pushy, it’s just what we find ourselves doing 90% of the time. To change this, simply modify your config/routes.rb to something like:

mountTandem::Engine=>"/tandem"

To change the url that you wish to serve unauthorized access errors supply a value to:

Tandem::Configuration.unauthorized_path

By default, the tandem generator copies all tandem layouts to app/views/layouts/tandem. If you wish to move your layouts to another location, supply a value to:

Tandem::Configuration.layouts_dir

By default, the uploaded images directly in the asset pipeline at :rails_root/public. To change this location, supply a value to:

Tandem::Configuration.uploaded_images_dir

By default, the uploaded images are stored and accessed via the default “paperclip” conventions (see paperclip gem). To change this behavior, supply a value to:

Tandem::Configuration.uploaded_images_template

Every new Tandem default page created has pre-defined classes setup to use either Bootstrap or 960.gs.

Here’s a preview of what the html looks like:

.container_12.row.clearfix
p#notice = notice
.grid_12.span12
= tandem_image_tag(@page, :default_image)
.grid_7.span7
= tandem_text_tag(@page, :tandem_text_block)
.grid_5.span5
= tandem_text_tag(@page, :tandem_sidebar)

If either of those grid systems are being used those styles will pull in accordingly.

  1. Fork it.

  2. Create a branch (git checkout -b my_markup)

  3. Commit your changes (git commit -am “Added Snarkdown”)

  4. Push to the branch (git push origin my_markup)

  5. Open a Pull Request

We are big believers in testing, so every pull request needs to be tested.

  1. Run Bundle

    bundleinstall
  2. Create the Database

    rakedb:create
  3. Run the Migrations

    rakedb:migrate
  4. Prepare the Test Database

    rake app:db:test:prepare
  5. See all the Green.

    rake

Tandem is released under the MIT license:

About

A simple Rails plugin that brings basic CMS functionality to any app. Just drop it in and go.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Tandem is a content management system (CMS) for Rails 3.1+. We felt like it was needed because too many of the CMS options for Rails are either unpolished—something we wouldn’t want to put in front of our clients or bloated and heavy, causing many headaches when trying to integrate into existing applications.

Tandem was designed to be as simple as can be to integrate into a larger application. It’s a mountable engine that allows you to easily specify how it fits into a larger application and doesn’t bring any opinions about how that application is architected.

The simplicity doesn’t stop there, though. It also has the end user in mind. Through in-place editing, users simply navigate their site like they normally would. If they want to edit something, they simply click on it, edit it, and go on their merry way.

It’s early in the life of Tandem and we have lots in store, but it’s something we find useful and hope you will too.

Has it ever been easier to check off that “CMS functionality” feature story?

This assumes you have a rails app already. If you don’t, rails new tandem_app

  1. Add the tandem gem to your Gemfile

    gem'tandem'
  2. Install the gem

    bundleinstall
  3. Generate the tandem files

    railsgtandem
  4. Migrate

    rakedb:migrate
  5. Start your app and you’re ready to go.

    railss

Upgrade just like you would any other engine.

  1. Update the gem version to the latest version in your gemfile if you specify a version.

    gem'tandem', '~> 0.2'
  2. Install the updated gem

    bundleupdatetandem
  3. Copy any new migrations from tandem

    rake tandem:install:migrations
  4. Migrate

    rakedb:migrate
  5. Enjoy the new tandem goodness.

    railss

By default, Tandem uses your application layout and Tandem’s pages/show template to render pages. Both of these can be customized for an individual page.

With Tandem, you can easily insert editable content into your page by using the simple helpers, tandem_text_tag and tandem_image_tag.

Simply insert those into your templates where you want the user to be able to edit content and Tandem will take care of the rest.

<div id="sidebar">
<%= tandem_image_tag(:sidebar_image)
<%= tandem_text_tag(:sidebar_text)
</div>

The tandem_text_tag defaults to a basic text area. If you’d like to offer a WYSIWYG editor, you can set the editor option to :wysiwyg:

<%= tandem_text_tag(:sidebar_text, editor: :wysiwyg) %>

Tandem comes with a helper method to add a navigation menu. It’s not included in the default views, since it will most likely be used in your app’s application layout. Adding it is easy, though.

<%= tandem_navigation_tag(@page) %>

By default, Tandem will produce a nested tree of all your pages. If you just want the top level:

<%= tandem_navigation_tag(@page, Tandem::Page.top_level) %>

If you want to show just the subnavication for a given page:

<%= tandem_navigation_tag(@page, @page.children) %>

You can also create submenus easily by passing in a custom collection of pages, e.g.

<%= tandem_navigation_tag(@page, Tandem::Page.find_by_title('Services').children) %>

Now, most apps don’t simply want to let anyone edit content. Tandem allows you to easily specify how it should control access.

Inside config/initializers/tandem.rb, you can define procs for Tandem to use for authentication and authorization.

  1. Tell Tandem how to find the current_user

    Tandem::Configuration.current_user_proc { |request|User.find(request.session['user_id']) unlessrequest.session['user_id'].blank?
    }
    
  2. Define what each user can do using CanCan

    Tandem::Configuration.user_abilities_proc { |user|user||=User.new# guest user (not logged in)ifuser.admin?can:manage, :allelsecan:read, :allend
    }
    

Tandem uses paperclip for file uploads. If your application needs to modify its settings, simply set the Tandem::Configuration.paperclip_options in /config/initializers/tandem.rb

For example, to store images on S3, add the aws-sdk gem to your Gemfile and set paperclip_options to:

Tandem::Configuration.paperclip_options = { :styles=> { :thumb=>"150x150>" },
:storage=>:s3,
:bucket=>Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
:s3_credentials=> {
:access_key_id=>ENV['S3_KEY'],
:secret_access_key=>ENV['S3_SECRET']
} }

By default, Tandem mounts to the root of your application. We’re not trying to be pushy, it’s just what we find ourselves doing 90% of the time. To change this, simply modify your config/routes.rb to something like:

mountTandem::Engine=>"/tandem"

To change the url that you wish to serve unauthorized access errors supply a value to:

Tandem::Configuration.unauthorized_path

By default, the tandem generator copies all tandem layouts to app/views/layouts/tandem. If you wish to move your layouts to another location, supply a value to:

Tandem::Configuration.layouts_dir

By default, the uploaded images directly in the asset pipeline at :rails_root/public. To change this location, supply a value to:

Tandem::Configuration.uploaded_images_dir

By default, the uploaded images are stored and accessed via the default “paperclip” conventions (see paperclip gem). To change this behavior, supply a value to:

Tandem::Configuration.uploaded_images_template

Every new Tandem default page created has pre-defined classes setup to use either Bootstrap or 960.gs.

Here’s a preview of what the html looks like:

.container_12.row.clearfix
p#notice = notice
.grid_12.span12
= tandem_image_tag(@page, :default_image)
.grid_7.span7
= tandem_text_tag(@page, :tandem_text_block)
.grid_5.span5
= tandem_text_tag(@page, :tandem_sidebar)

If either of those grid systems are being used those styles will pull in accordingly.

  1. Fork it.

  2. Create a branch (git checkout -b my_markup)

  3. Commit your changes (git commit -am “Added Snarkdown”)

  4. Push to the branch (git push origin my_markup)

  5. Open a Pull Request

We are big believers in testing, so every pull request needs to be tested.

  1. Run Bundle

    bundleinstall
  2. Create the Database

    rakedb:create
  3. Run the Migrations

    rakedb:migrate
  4. Prepare the Test Database

    rake app:db:test:prepare
  5. See all the Green.

    rake

Tandem is released under the MIT license:

About

A simple Rails plugin that brings basic CMS functionality to any app. Just drop it in and go.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Tandem is a content management system (CMS) for Rails 3.1+. We felt like it was needed because too many of the CMS options for Rails are either unpolished—something we wouldn’t want to put in front of our clients or bloated and heavy, causing many headaches when trying to integrate into existing applications.

Tandem was designed to be as simple as can be to integrate into a larger application. It’s a mountable engine that allows you to easily specify how it fits into a larger application and doesn’t bring any opinions about how that application is architected.

The simplicity doesn’t stop there, though. It also has the end user in mind. Through in-place editing, users simply navigate their site like they normally would. If they want to edit something, they simply click on it, edit it, and go on their merry way.

It’s early in the life of Tandem and we have lots in store, but it’s something we find useful and hope you will too.

Has it ever been easier to check off that “CMS functionality” feature story?

This assumes you have a rails app already. If you don’t, rails new tandem_app

  1. Add the tandem gem to your Gemfile

    gem'tandem'
  2. Install the gem

    bundleinstall
  3. Generate the tandem files

    railsgtandem
  4. Migrate

    rakedb:migrate
  5. Start your app and you’re ready to go.

    railss

Upgrade just like you would any other engine.

  1. Update the gem version to the latest version in your gemfile if you specify a version.

    gem'tandem', '~> 0.2'
  2. Install the updated gem

    bundleupdatetandem
  3. Copy any new migrations from tandem

    rake tandem:install:migrations
  4. Migrate

    rakedb:migrate
  5. Enjoy the new tandem goodness.

    railss

By default, Tandem uses your application layout and Tandem’s pages/show template to render pages. Both of these can be customized for an individual page.

With Tandem, you can easily insert editable content into your page by using the simple helpers, tandem_text_tag and tandem_image_tag.

Simply insert those into your templates where you want the user to be able to edit content and Tandem will take care of the rest.

<div id="sidebar">
<%= tandem_image_tag(:sidebar_image)
<%= tandem_text_tag(:sidebar_text)
</div>

The tandem_text_tag defaults to a basic text area. If you’d like to offer a WYSIWYG editor, you can set the editor option to :wysiwyg:

<%= tandem_text_tag(:sidebar_text, editor: :wysiwyg) %>

Tandem comes with a helper method to add a navigation menu. It’s not included in the default views, since it will most likely be used in your app’s application layout. Adding it is easy, though.

<%= tandem_navigation_tag(@page) %>

By default, Tandem will produce a nested tree of all your pages. If you just want the top level:

<%= tandem_navigation_tag(@page, Tandem::Page.top_level) %>

If you want to show just the subnavication for a given page:

<%= tandem_navigation_tag(@page, @page.children) %>

You can also create submenus easily by passing in a custom collection of pages, e.g.

<%= tandem_navigation_tag(@page, Tandem::Page.find_by_title('Services').children) %>

Now, most apps don’t simply want to let anyone edit content. Tandem allows you to easily specify how it should control access.

Inside config/initializers/tandem.rb, you can define procs for Tandem to use for authentication and authorization.

  1. Tell Tandem how to find the current_user

    Tandem::Configuration.current_user_proc { |request|User.find(request.session['user_id']) unlessrequest.session['user_id'].blank?
    }
    
  2. Define what each user can do using CanCan

    Tandem::Configuration.user_abilities_proc { |user|user||=User.new# guest user (not logged in)ifuser.admin?can:manage, :allelsecan:read, :allend
    }
    

Tandem uses paperclip for file uploads. If your application needs to modify its settings, simply set the Tandem::Configuration.paperclip_options in /config/initializers/tandem.rb

For example, to store images on S3, add the aws-sdk gem to your Gemfile and set paperclip_options to:

Tandem::Configuration.paperclip_options = { :styles=> { :thumb=>"150x150>" },
:storage=>:s3,
:bucket=>Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
:s3_credentials=> {
:access_key_id=>ENV['S3_KEY'],
:secret_access_key=>ENV['S3_SECRET']
} }

By default, Tandem mounts to the root of your application. We’re not trying to be pushy, it’s just what we find ourselves doing 90% of the time. To change this, simply modify your config/routes.rb to something like:

mountTandem::Engine=>"/tandem"

To change the url that you wish to serve unauthorized access errors supply a value to:

Tandem::Configuration.unauthorized_path

By default, the tandem generator copies all tandem layouts to app/views/layouts/tandem. If you wish to move your layouts to another location, supply a value to:

Tandem::Configuration.layouts_dir

By default, the uploaded images directly in the asset pipeline at :rails_root/public. To change this location, supply a value to:

Tandem::Configuration.uploaded_images_dir

By default, the uploaded images are stored and accessed via the default “paperclip” conventions (see paperclip gem). To change this behavior, supply a value to:

Tandem::Configuration.uploaded_images_template

Every new Tandem default page created has pre-defined classes setup to use either Bootstrap or 960.gs.

Here’s a preview of what the html looks like:

.container_12.row.clearfix
p#notice = notice
.grid_12.span12
= tandem_image_tag(@page, :default_image)
.grid_7.span7
= tandem_text_tag(@page, :tandem_text_block)
.grid_5.span5
= tandem_text_tag(@page, :tandem_sidebar)

If either of those grid systems are being used those styles will pull in accordingly.

  1. Fork it.

  2. Create a branch (git checkout -b my_markup)

  3. Commit your changes (git commit -am “Added Snarkdown”)

  4. Push to the branch (git push origin my_markup)

  5. Open a Pull Request

We are big believers in testing, so every pull request needs to be tested.

  1. Run Bundle

    bundleinstall
  2. Create the Database

    rakedb:create
  3. Run the Migrations

    rakedb:migrate
  4. Prepare the Test Database

    rake app:db:test:prepare
  5. See all the Green.

    rake

Tandem is released under the MIT license:

About

A simple Rails plugin that brings basic CMS functionality to any app. Just drop it in and go.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Tandem is a content management system (CMS) for Rails 3.1+. We felt like it was needed because too many of the CMS options for Rails are either unpolished—something we wouldn’t want to put in front of our clients or bloated and heavy, causing many headaches when trying to integrate into existing applications.

Tandem was designed to be as simple as can be to integrate into a larger application. It’s a mountable engine that allows you to easily specify how it fits into a larger application and doesn’t bring any opinions about how that application is architected.

The simplicity doesn’t stop there, though. It also has the end user in mind. Through in-place editing, users simply navigate their site like they normally would. If they want to edit something, they simply click on it, edit it, and go on their merry way.

It’s early in the life of Tandem and we have lots in store, but it’s something we find useful and hope you will too.

Has it ever been easier to check off that “CMS functionality” feature story?

This assumes you have a rails app already. If you don’t, rails new tandem_app

  1. Add the tandem gem to your Gemfile

    gem'tandem'
  2. Install the gem

    bundleinstall
  3. Generate the tandem files

    railsgtandem
  4. Migrate

    rakedb:migrate
  5. Start your app and you’re ready to go.

    railss

Upgrade just like you would any other engine.

  1. Update the gem version to the latest version in your gemfile if you specify a version.

    gem'tandem', '~> 0.2'
  2. Install the updated gem

    bundleupdatetandem
  3. Copy any new migrations from tandem

    rake tandem:install:migrations
  4. Migrate

    rakedb:migrate
  5. Enjoy the new tandem goodness.

    railss

By default, Tandem uses your application layout and Tandem’s pages/show template to render pages. Both of these can be customized for an individual page.

With Tandem, you can easily insert editable content into your page by using the simple helpers, tandem_text_tag and tandem_image_tag.

Simply insert those into your templates where you want the user to be able to edit content and Tandem will take care of the rest.

<div id="sidebar">
<%= tandem_image_tag(:sidebar_image)
<%= tandem_text_tag(:sidebar_text)
</div>

The tandem_text_tag defaults to a basic text area. If you’d like to offer a WYSIWYG editor, you can set the editor option to :wysiwyg:

<%= tandem_text_tag(:sidebar_text, editor: :wysiwyg) %>

Tandem comes with a helper method to add a navigation menu. It’s not included in the default views, since it will most likely be used in your app’s application layout. Adding it is easy, though.

<%= tandem_navigation_tag(@page) %>

By default, Tandem will produce a nested tree of all your pages. If you just want the top level:

<%= tandem_navigation_tag(@page, Tandem::Page.top_level) %>

If you want to show just the subnavication for a given page:

<%= tandem_navigation_tag(@page, @page.children) %>

You can also create submenus easily by passing in a custom collection of pages, e.g.

<%= tandem_navigation_tag(@page, Tandem::Page.find_by_title('Services').children) %>

Now, most apps don’t simply want to let anyone edit content. Tandem allows you to easily specify how it should control access.

Inside config/initializers/tandem.rb, you can define procs for Tandem to use for authentication and authorization.

  1. Tell Tandem how to find the current_user

    Tandem::Configuration.current_user_proc { |request|User.find(request.session['user_id']) unlessrequest.session['user_id'].blank?
    }
    
  2. Define what each user can do using CanCan

    Tandem::Configuration.user_abilities_proc { |user|user||=User.new# guest user (not logged in)ifuser.admin?can:manage, :allelsecan:read, :allend
    }
    

Tandem uses paperclip for file uploads. If your application needs to modify its settings, simply set the Tandem::Configuration.paperclip_options in /config/initializers/tandem.rb

For example, to store images on S3, add the aws-sdk gem to your Gemfile and set paperclip_options to:

Tandem::Configuration.paperclip_options = { :styles=> { :thumb=>"150x150>" },
:storage=>:s3,
:bucket=>Proc.new { Rails.application.engine_name.gsub(/application$/, Rails.env) },
:s3_credentials=> {
:access_key_id=>ENV['S3_KEY'],
:secret_access_key=>ENV['S3_SECRET']
} }

By default, Tandem mounts to the root of your application. We’re not trying to be pushy, it’s just what we find ourselves doing 90% of the time. To change this, simply modify your config/routes.rb to something like:

mountTandem::Engine=>"/tandem"

To change the url that you wish to serve unauthorized access errors supply a value to:

Tandem::Configuration.unauthorized_path

By default, the tandem generator copies all tandem layouts to app/views/layouts/tandem. If you wish to move your layouts to another location, supply a value to:

Tandem::Configuration.layouts_dir

By default, the uploaded images directly in the asset pipeline at :rails_root/public. To change this location, supply a value to:

Tandem::Configuration.uploaded_images_dir

By default, the uploaded images are stored and accessed via the default “paperclip” conventions (see paperclip gem). To change this behavior, supply a value to:

Tandem::Configuration.uploaded_images_template

Every new Tandem default page created has pre-defined classes setup to use either Bootstrap or 960.gs.

Here’s a preview of what the html looks like:

.container_12.row.clearfix
p#notice = notice
.grid_12.span12
= tandem_image_tag(@page, :default_image)
.grid_7.span7
= tandem_text_tag(@page, :tandem_text_block)
.grid_5.span5
= tandem_text_tag(@page, :tandem_sidebar)

If either of those grid systems are being used those styles will pull in accordingly.

  1. Fork it.

  2. Create a branch (git checkout -b my_markup)

  3. Commit your changes (git commit -am “Added Snarkdown”)

  4. Push to the branch (git push origin my_markup)

  5. Open a Pull Request

We are big believers in testing, so every pull request needs to be tested.

  1. Run Bundle

    bundleinstall
  2. Create the Database

    rakedb:create
  3. Run the Migrations

    rakedb:migrate
  4. Prepare the Test Database

    rake app:db:test:prepare
  5. See all the Green.

    rake

Tandem is released under the MIT license:

About

A simple Rails plugin that brings basic CMS functionality to any app. Just drop it in and go.

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages