Railsにこれから初めて触れる方を対象にしたチュートリアルです
Opalを使用したRuby
のオンライン実行環境構築チュートリアルになります
まず、rails new
を実行し、Railsアプリのひな型を作成します
rails new opal
次に、作成したRailsアプリのディレクトリへと移動します
cd opal
先ほどのrails new
でsqlite3
のインストールがエラーになっている場合は、以下のようにバージョンを指定してください
gem 'sqlite3', '1.3.13'
その後、bundle install
を実行します
bundle install
rails g scaffold
を使い、Ruby
のソースコードを管理するModel
などを作成します
rails g scaffold code title:string content:string
その後、rails db:migrate
を実行します
rails db:migrate
ace-rails-ap
というgem
を使い、Aceエディターを使用します
まずGemfile
に必要なgem
を追加します
gem 'ace-rails-ap'
gem 'jquery-rails'
その後、bundle install
を実行します
bundle install
次に、app/assets/javascripts/application.js
に以下の4行を追加します
//= require jquery
//= require ace-rails-ap
//= require ace/theme-monokai
//= require ace/mode-ruby
次に、app/views/codes/_form.html.erb
でエディターを使用したいところを以下のようにします
<div class="field">
<%= form.label :content %>
<%= form.text_area :content, id: 'ruby_code' %>
<div id="editor" class="inner"></div>
</div>
その後、app/assets/javascripts/codes.coffee
でエディターを表示し、その内容をtext_area
に格納できるようにします
$(document).on 'turbolinks:load', ->
if !($('#editor').length) then return false
editor = ace.edit('editor')
textarea = $('#ruby_code').hide()
editor.setTheme('ace/theme/monokai')
editor.getSession().setMode('ace/mode/ruby')
editor.getSession().setValue(textarea.val())
editor.getSession().on('change', ->
textarea.val(editor.getSession().getValue()))
これでOKと行きたいところですが、このままだとエディターの高さがなく、エディターがブラウザ上で表示されません
そこで、CSS
の.inner
をapp/assets/stylesheets/codes.scss
を以下のように変更します
.inner {
height:300px;
padding-right:0;
padding-left: 0;
background-color: #ccc;
}
これでエディターを使用することができます!
さて、最後にOpalを導入します
Opal
自体はCDNでインストールします
app/views/codes/show.html.erb
に以下のCDN読込コードを追加します
<script src="https://cdn.opalrb.com/opal/current/opal.js" onload="Opal.load('opal')"></script>
<script src="https://cdn.opalrb.com/opal/current/opal-parser.js" onload="Opal.load('opal-parser')"></script>
app/views/codes/show.html.erb
で、以下のように<script type="text/ruby">
内にRubyのコードを展開できるようにします
<script type="text/ruby">
<%= sanitize @code.content %>
</script>
RubyのputsはJavaScriptのconsole.logに変換されるため、このままですとDevToolなどのコンソールに実行結果が表示されます
実行結果をHTML上に表示できるようにするには以下のようにconsole.log
を再定義する必要があります
そこでapp/assets/javascripts/application.js
に以下のコードを追加します
var console = {};
console.log = function(hogehoge){ $(".exec").append(`${hogehoge}<br>`)};
JQuery
を使い、.exec
を持つ<div>にconsole.logで表示されている実行結果が表示されるようになります
最終的なコードとしては以下のようになります
<script src="https://cdn.opalrb.com/opal/current/opal.js" onload="Opal.load('opal')"></script>
<script src="https://cdn.opalrb.com/opal/current/opal-parser.js" onload="Opal.load('opal-parser')"></script>
<p id="notice"><%= notice %></p>
<p>
<strong>Title:</strong>
<%= @code.title %>
</p>
<p>
<strong>Content:</strong>
<%= @code.content %>
</p>
<p>実行結果</p>
<div class="exec"></div>
<script type="text/ruby">
<%= sanitize @code.content %>
</script>
<%= link_to 'Edit', edit_code_path(@code) %> |
<%= link_to 'Back', codes_path %>
これでOpal
を使用してのRubyのオンライン実行環境が構築できました!