{"id":2966,"date":"2015-10-01T17:39:20","date_gmt":"2015-10-01T13:39:20","guid":{"rendered":"http:\/\/www.dhtmlx.com\/blog\/?p=2966"},"modified":"2025-03-28T19:51:09","modified_gmt":"2025-03-28T16:51:09","slug":"use-dhtmlxscheduler-ruby-rails-part-1-tutorial","status":"publish","type":"post","link":"https:\/\/dhtmlx.com\/blog\/use-dhtmlxscheduler-ruby-rails-part-1-tutorial\/","title":{"rendered":"How to Use dhtmlxScheduler with Ruby on Rails &#8211; Part 1 [Tutorial]"},"content":{"rendered":"<p>In this tutorial we&#8217;d like to show you how to use our <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/\" target=\"_blank\">scheduling calendar<\/a>, dhtmlxScheduler, with <a href=\"https:\/\/rubyonrails.org\/\" target=\"_blank\">Ruby on Rails<\/a>, a web application framework written in Ruby. The tutorial consists of two parts: firstly, we&#8217;ll create a simple scheduler with data saving and loading, the second part is adding recurring events to it. Let&#8217;s start.<\/p>\n<p><a href=\"\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/download.shtml\" onclick=\"ga('send', 'event', 'link', 'click', 'download-scheduler-RubyonRails-blog')\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2013\/11\/download-scheduler-banner.png\" alt=\"download scheduler\" width=\"900\" height=\"300\" class=\"aligncenter size-full wp-image-3704\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2013\/11\/download-scheduler-banner.png 900w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2013\/11\/download-scheduler-banner-300x100.png 300w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2013\/11\/download-scheduler-banner-768x256.png 768w\" sizes=\"auto, (max-width: 900px) 100vw, 900px\" \/><\/a><\/p>\n<p><!--more--><\/p>\n<h3>Creating a scheduler<\/h3>\n<p>\n<strong>Step 1.<\/strong> The first thing we need to do is to create a new project. For this we need to run the next command:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">rails <span class=\"kw5\">new<\/span> path<span class=\"sy0\">\/<\/span>to<span class=\"sy0\">\/<\/span>your<span class=\"sy0\">\/<\/span>application<\/div><\/div>\n<p><strong>Step 2.<\/strong> After that create a home controller:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">rails generate controller home index<\/div><\/div>\n<p><strong>Step 3.<\/strong> Open config\/routes.rb and replace<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">get <span class=\"st0\">'home\/index'<\/span><\/div><\/div>\n<p>with<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">root <span class=\"re3\">:to<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">'home#index'<\/span><\/div><\/div>\n<p>When it&#8217;s done, check the server performance with the following command:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">rails server<\/div><\/div>\n<p>When you open <em>http:\/\/localhost:3000\/<\/em> in browser, you should get this page:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/localhost-ror.png\" alt=\"localhost-ror\" width=\"600\" height=\"341\" class=\"aligncenter size-full wp-image-2982\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/localhost-ror.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/localhost-ror-300x170.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p><strong>Step 4.<\/strong> Finished with these settings, we&#8217;ll proceed to Scheduler component. So, the next step is to <a href=\"https:\/\/dhtmlx.com\/docs\/products\/dhtmlxScheduler\/download.shtml\" target=\"_blank\">download dhtmlxScheduler<\/a>.<\/p>\n<p>The following files unpack to vendor\/assets\/javascripts\/:<\/p>\n<p><em>codebase\/dhtmlxscheduler.js<br \/>\ncodebase\/ext<br \/>\ncodebase\/locale<\/em><\/p>\n<p>These files to vendor\/assets\/stylesheets\/:<\/p>\n<p><em>codebase\/dhtmlxscheduler.css<br \/>\ncodebase\/dhtmlxscheduler_classic.css<br \/>\ncodebase\/dhtmlxscheduler_flat.css<br \/>\ncodebase\/dhtmlxscheduler_glossy.css<\/em><\/p>\n<p>Then we need to create &#8220;assets&#8221; folder in the &#8220;public&#8221; directory and unpack the following files to it: <\/p>\n<p><em>codebase\/imgs<br \/>\ncodebase\/imgs_dhx_terrace<br \/>\ncodebase\/imgs_flat<br \/>\ncodebase\/imgs_glossy<\/em><\/p>\n<p>Open config\/initializers\/assets.rb. We need to add the style sheet and dhtmlxscheduler.js file to the precompile array.<\/p>\n<p>For this, add the next lines to this file:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">Rails.<span class=\"me1\">application<\/span>.<span class=\"me1\">config<\/span>.<span class=\"me1\">assets<\/span>.<span class=\"me1\">precompile<\/span> <span class=\"sy0\">+<\/span>= <span class=\"sy0\">%<\/span>w<span class=\"br0\">&#40;<\/span> dhtmlxscheduler.<span class=\"me1\">css<\/span> <span class=\"br0\">&#41;<\/span><br \/>\nRails.<span class=\"me1\">application<\/span>.<span class=\"me1\">config<\/span>.<span class=\"me1\">assets<\/span>.<span class=\"me1\">precompile<\/span> <span class=\"sy0\">+<\/span>= <span class=\"sy0\">%<\/span>w<span class=\"br0\">&#40;<\/span> dhtmlxscheduler.<span class=\"me1\">js<\/span> <span class=\"br0\">&#41;<\/span><\/div><\/div>\n<p><strong>Step 5.<\/strong> Open app\/views\/layouts\/application.html.erb. This file is a template for all the pages that have common elements.<\/p>\n<p>Here we include dhtmlxscheduler.js and dhtmlxscheduler.css<\/p>\n<div class=\"codecolorer-container html4strict default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"html4strict codecolorer\"><span class=\"sc0\">&lt;!DOCTYPE html&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"kw2\">html<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"kw2\">head<\/span>&gt;<\/span><br \/>\n&nbsp;<span class=\"sc2\">&lt;<span class=\"kw2\">title<\/span>&gt;<\/span>Scheduler on Rails<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">title<\/span>&gt;<\/span><br \/>\n&nbsp;<span class=\"sc2\">&lt;%<span class=\"sy0\">=<\/span> stylesheet_link_tag &nbsp; &nbsp;<span class=\"st0\">'application'<\/span>, <span class=\"kw3\">media<\/span>: <span class=\"st0\">'all'<\/span>, <span class=\"st0\">'data-turbolinks-track'<\/span> <span class=\"sy0\">=<\/span>&gt;<\/span> true %&gt;<br \/>\n&nbsp;<span class=\"sc2\">&lt;%<span class=\"sy0\">=<\/span> stylesheet_link_tag <span class=\"st0\">'dhtmlxscheduler'<\/span>, <span class=\"kw3\">media<\/span>: <span class=\"st0\">'all'<\/span>, <span class=\"st0\">'data-turbolinks-track'<\/span> <span class=\"sy0\">=<\/span>&gt;<\/span> true %&gt;<br \/>\n&nbsp;<span class=\"sc2\">&lt;%<span class=\"sy0\">=<\/span> javascript_include_tag <span class=\"st0\">'application'<\/span>, <span class=\"st0\">'data-turbolinks-track'<\/span> <span class=\"sy0\">=<\/span>&gt;<\/span> true %&gt;<br \/>\n&nbsp;<span class=\"sc2\">&lt;%<span class=\"sy0\">=<\/span> javascript_include_tag <span class=\"st0\">'dhtmlxscheduler'<\/span>, <span class=\"st0\">'data-turbolinks-track'<\/span> <span class=\"sy0\">=<\/span>&gt;<\/span> true %&gt;<br \/>\n&nbsp;<span class=\"sc2\">&lt;%<span class=\"sy0\">=<\/span> csrf_meta_tags %&gt;<\/span> &nbsp;<br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">head<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"kw2\">body<\/span>&gt;<\/span><br \/>\n<br \/>\n<span class=\"sc2\">&lt;%<span class=\"sy0\">=<\/span> yield %&gt;<\/span><br \/>\n<br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">body<\/span>&gt;<\/span><br \/>\n<span class=\"sc2\">&lt;<span class=\"sy0\">\/<\/span><span class=\"kw2\">html<\/span>&gt;<\/span><\/div><\/div>\n<p><strong>Step 6.<\/strong> In this step we open app\/views\/home\/index.html.erb, the file that is used for a view for our home controller. It will display the scheduler.<\/p>\n<p>Now we add a container for scheduler, and then initialize our calendar:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">&lt;<\/span>div id<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span> <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_container&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">'width:100%; height:800px;'<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_navline&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_prev_button&quot;<\/span><span class=\"sy0\">&gt;&amp;<\/span>nbsp<span class=\"sy0\">;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_next_button&quot;<\/span><span class=\"sy0\">&gt;&amp;<\/span>nbsp<span class=\"sy0\">;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_today_button&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_date&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;day_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:204px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;week_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:140px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;month_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:76px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_header&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_data&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\n<span class=\"sy0\">&lt;<\/span>script<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;scheduler.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"sy0\">&lt;\/<\/span>script<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p>If we run the server now, we should get our scheduler.<\/p>\n<p><a href=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/scheduler-init1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/scheduler-init1.png\" alt=\"scheduler-init\" width=\"600\" height=\"287\" class=\"aligncenter size-full wp-image-2983\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/scheduler-init1.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/scheduler-init1-300x143.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/a><\/p>\n<p><strong>Step 7.<\/strong> Well, dhtmlxSheduler is initialized and we may proceed to further settings. Let&#8217;s create a model for an event. For this, run the following command:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">rails generate model Event start_date:datetime end_date:datetime text:string<\/div><\/div>\n<p>To create a database, run this:<\/p>\n<div class=\"codecolorer-container ruby default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"ruby codecolorer\">rake db:migrate<\/div><\/div>\n<p><strong> Step 8.<\/strong> The database is created, but let\u2019s check it and add a record. For this, run:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">rails c<\/div><\/div>\n<p>And add some sample record:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">Event.<span class=\"me1\">create<\/span> <span class=\"re3\">:start_date<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;2015-05-22 10:00:00&quot;<\/span>, <span class=\"re3\">:end_date<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;2015-05-22 15:00:00&quot;<\/span>, <span class=\"re3\">:text<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;Test&quot;<\/span><\/div><\/div>\n<p>To display all the records, we need to run this command:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">Event.<span class=\"me1\">all<\/span><\/div><\/div>\n<p>For exit we use &#8220;exit&#8221; command.<\/p>\n<p><strong>Step 9.<\/strong> Now we open config\/routes.rb and add the route for data loading:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">match <span class=\"st0\">&quot;home\/data&quot;<\/span>, <span class=\"re3\">:to<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;home#data&quot;<\/span>, <span class=\"re3\">:as<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;data&quot;<\/span>, <span class=\"re3\">:via<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;get&quot;<\/span><\/div><\/div>\n<p><strong>Step 10.<\/strong> Open app\/controllers\/home_controller.rb and add \u201cdata\u201d action to the controller:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\"><span class=\"kw1\">def<\/span> data<br \/>\n&nbsp; &nbsp;events = Event.<span class=\"me1\">all<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"kw5\">render<\/span> <span class=\"re3\">:json<\/span> <span class=\"sy0\">=&gt;<\/span> events.<span class=\"me1\">map<\/span> <span class=\"br0\">&#123;<\/span><span class=\"sy0\">|<\/span>event<span class=\"sy0\">|<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re3\">:id<\/span> <span class=\"sy0\">=&gt;<\/span> event.<span class=\"me1\">id<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re3\">:start_date<\/span> <span class=\"sy0\">=&gt;<\/span> event.<span class=\"me1\">start_date<\/span>.<span class=\"me1\">to_formatted_s<\/span><span class=\"br0\">&#40;<\/span><span class=\"re3\">:db<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re3\">:end_date<\/span> <span class=\"sy0\">=&gt;<\/span> event.<span class=\"me1\">end_date<\/span>.<span class=\"me1\">to_formatted_s<\/span><span class=\"br0\">&#40;<\/span><span class=\"re3\">:db<\/span><span class=\"br0\">&#41;<\/span>,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re3\">:text<\/span> <span class=\"sy0\">=&gt;<\/span> event.<span class=\"me1\">text<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><span class=\"br0\">&#125;<\/span><br \/>\n&nbsp;<span class=\"kw1\">end<\/span><\/div><\/div>\n<p><strong>Step 11.<\/strong> In this step we open app\/views\/home\/index.html.erb for adding data loading from the server. It&#8217;s important to set scheduler.config.xml_date for correct dates parsing.<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">&lt;<\/span>div id<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span> <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_container&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">'width:100%; height:800px;'<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_navline&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_prev_button&quot;<\/span><span class=\"sy0\">&gt;&amp;<\/span>nbsp<span class=\"sy0\">;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_next_button&quot;<\/span><span class=\"sy0\">&gt;&amp;<\/span>nbsp<span class=\"sy0\">;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_today_button&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_date&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;day_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:204px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;week_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:140px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;month_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:76px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_header&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_data&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\n<span class=\"sy0\">&lt;<\/span>script<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p>If everything is done correctly, the data loading should be successful.<\/p>\n<p><strong>Step 12.<\/strong> We continue with opening config\/routes.rb for adding a route for data handling:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">match <span class=\"st0\">&quot;home\/db_action&quot;<\/span>, <span class=\"re3\">:to<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;home#db_action&quot;<\/span>, <span class=\"re3\">:as<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;db_action&quot;<\/span>, <span class=\"re3\">:via<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;get&quot;<\/span><\/div><\/div>\n<p><strong>Step 13.<\/strong> Open app\/controllers\/home_controller.rb. Add \u201cdb_action\u201d action to the controller:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\"><span class=\"kw1\">def<\/span> db_action<br \/>\n&nbsp; &nbsp;mode = params<span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;!nativeeditor_status&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp;id = params<span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;id&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp;start_date = params<span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;start_date&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp;end_date = params<span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;end_date&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n&nbsp; &nbsp;text = params<span class=\"br0\">&#91;<\/span><span class=\"st0\">&quot;text&quot;<\/span><span class=\"br0\">&#93;<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"kw1\">case<\/span> mode<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw1\">when<\/span> <span class=\"st0\">&quot;inserted&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;event = Event.<span class=\"me1\">create<\/span> <span class=\"re3\">:start_date<\/span> <span class=\"sy0\">=&gt;<\/span> start_date, <span class=\"re3\">:end_date<\/span> <span class=\"sy0\">=&gt;<\/span> end_date, <span class=\"re3\">:text<\/span> <span class=\"sy0\">=&gt;<\/span> text<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;tid = event.<span class=\"me1\">id<\/span><br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw1\">when<\/span> <span class=\"st0\">&quot;deleted&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;Event.<span class=\"me1\">find<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span>.<span class=\"kw5\">destroy<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;tid = id<br \/>\n<br \/>\n&nbsp; &nbsp; &nbsp;<span class=\"kw1\">when<\/span> <span class=\"st0\">&quot;updated&quot;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;event = Event.<span class=\"me1\">find<\/span><span class=\"br0\">&#40;<\/span>id<span class=\"br0\">&#41;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;event.<span class=\"me1\">start_date<\/span> = start_date<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;event.<span class=\"me1\">end_date<\/span> = end_date<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;event.<span class=\"me1\">text<\/span> = text<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;event.<span class=\"kw5\">save<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp;tid = id<br \/>\n&nbsp; &nbsp;<span class=\"kw1\">end<\/span><br \/>\n<br \/>\n&nbsp; &nbsp;<span class=\"kw5\">render<\/span> <span class=\"re3\">:json<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"br0\">&#123;<\/span><br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re3\">:type<\/span> <span class=\"sy0\">=&gt;<\/span> mode,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re3\">:sid<\/span> <span class=\"sy0\">=&gt;<\/span> id,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"re3\">:tid<\/span> <span class=\"sy0\">=&gt;<\/span> tid,<br \/>\n&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class=\"br0\">&#125;<\/span><br \/>\n&nbsp;<span class=\"kw1\">end<\/span><\/div><\/div>\n<p><strong>Step 14.<\/strong> To save the changes in scheduler we need to use DataProcessor. Open app\/views\/home\/index.html.erb.<\/p>\n<p>Add dataProcessor:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">var dp = <span class=\"kw5\">new<\/span> dataProcessor<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&lt;%= db_action_path %&gt;&quot;<\/span><span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; dp.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span>scheduler<span class=\"br0\">&#41;<\/span>;<br \/>\n&nbsp; &nbsp; &nbsp; dp.<span class=\"me1\">setTransactionMode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;GET&quot;<\/span>, <span class=\"kw2\">false<\/span><span class=\"br0\">&#41;<\/span>;<\/div><\/div>\n<p>As a result we should have:<\/p>\n<div class=\"codecolorer-container javascript default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"javascript codecolorer\"><span class=\"sy0\">&lt;<\/span>div id<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span> <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_container&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">'width:100%; height:800px;'<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_navline&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_prev_button&quot;<\/span><span class=\"sy0\">&gt;&amp;<\/span>nbsp<span class=\"sy0\">;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_next_button&quot;<\/span><span class=\"sy0\">&gt;&amp;<\/span>nbsp<span class=\"sy0\">;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_today_button&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_date&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;day_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:204px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;week_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:140px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_tab&quot;<\/span> name<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;month_tab&quot;<\/span> style<span class=\"sy0\">=<\/span><span class=\"st0\">&quot;right:76px;&quot;<\/span><span class=\"sy0\">&gt;&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_header&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;<\/span>div <span class=\"kw5\">class<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;dhx_cal_data&quot;<\/span><span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp;<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n<span class=\"sy0\">&lt;\/<\/span>div<span class=\"sy0\">&gt;<\/span><br \/>\n<br \/>\n<span class=\"sy0\">&lt;<\/span>script<span class=\"sy0\">&gt;<\/span><br \/>\n&nbsp; &nbsp; scheduler.<span class=\"me1\">config<\/span>.<span class=\"me1\">xml_date<\/span><span class=\"sy0\">=<\/span><span class=\"st0\">&quot;%Y-%m-%d %H:%i&quot;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; scheduler.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;scheduler_here&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; scheduler.<span class=\"me1\">load<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&lt;%= data_path %&gt;&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"st0\">&quot;json&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; <span class=\"kw1\">var<\/span> dp <span class=\"sy0\">=<\/span> <span class=\"kw1\">new<\/span> dataProcessor<span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;&lt;%= db_action_path %&gt;&quot;<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; dp.<span class=\"me1\">init<\/span><span class=\"br0\">&#40;<\/span>scheduler<span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n&nbsp; &nbsp; dp.<span class=\"me1\">setTransactionMode<\/span><span class=\"br0\">&#40;<\/span><span class=\"st0\">&quot;GET&quot;<\/span><span class=\"sy0\">,<\/span> <span class=\"kw2\">false<\/span><span class=\"br0\">&#41;<\/span><span class=\"sy0\">;<\/span><br \/>\n<span class=\"sy0\">&lt;\/<\/span>script<span class=\"sy0\">&gt;<\/span><\/div><\/div>\n<p>But if you&#8217;d like to use POST requests for changing the data in the database, you need to specify Transaction Mode dataProcessor = POST. Moreover, you need to change the corresponding route to:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">match <span class=\"st0\">&quot;home\/db_action&quot;<\/span>, <span class=\"re3\">:to<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;home#db_action&quot;<\/span>, <span class=\"re3\">:as<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;db_action&quot;<\/span>, <span class=\"re3\">:via<\/span> <span class=\"sy0\">=&gt;<\/span> <span class=\"st0\">&quot;post&quot;<\/span><\/div><\/div>\n<p>And you need to open app\/controllers\/application_controller.rb and set<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">protect_from_forgery with: <span class=\"re3\">:null_session<\/span><\/div><\/div>\n<p>instead of<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">protect_from_forgery with: <span class=\"re3\">:exception<\/span><\/div><\/div>\n<p><strong>Step 15.<\/strong> Finally we&#8217;re ready to check our results. So, run the server:<\/p>\n<div class=\"codecolorer-container rails default codecolorer-noborder\" style=\"overflow:auto;white-space:nowrap;\"><div class=\"rails codecolorer\">rails server<\/div><\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/scheduler-with-rails.png\" alt=\"scheduler-with-rails\" width=\"600\" height=\"287\" class=\"aligncenter size-full wp-image-2984\" srcset=\"https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/scheduler-with-rails.png 600w, https:\/\/dhtmlx.com\/blog\/wp-content\/uploads\/2015\/10\/scheduler-with-rails-300x143.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Well, this is everything you need to start using dhtmlxScheduler with Ruby on Rails. The second part of our tutorial that will show you how to set recurring events in dhtmlxScheduler with RoR will be released in a week. Stay tuned!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial we&#8217;d like to show you how to use our scheduling calendar, dhtmlxScheduler, with Ruby on Rails, a web application framework written in Ruby. The tutorial consists &#8230;<\/p>\n","protected":false},"author":2,"featured_media":3804,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17,71,1,38],"tags":[33,14,36,15],"class_list":["post-2966","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-posts-for-codeproject-com","category-tutorials","category-uncategorized","category-visible","tag-all-posts","tag-tips","tag-ruby-on-rails","tag-dhtmlxscheduler"],"_links":{"self":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/2966","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/comments?post=2966"}],"version-history":[{"count":4,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/2966\/revisions"}],"predecessor-version":[{"id":13638,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/posts\/2966\/revisions\/13638"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media\/3804"}],"wp:attachment":[{"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/media?parent=2966"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/categories?post=2966"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dhtmlx.com\/blog\/wp-json\/wp\/v2\/tags?post=2966"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}