Hello World from OSS Silicon Valley


HowToUse/RubyOnRails/4.2


#contents

*Prerequisite [#bb767f77]
-Ubuntu Server (You can refer [[HowToUse/UbuntuServer/14.04]])
-RVM (You can refer [[HowToUse/RVM/1.25]])

*Install&Setup [#lf764479]
:Step.1|
Check if the rails has already been installed.
 $ rails --version

:Step.2|
If the rails has not been installed yet, execute the following command
 $ gem install rails


*HowToUse [#t9e5e7e8]
**Create new application [#w94319d5]
:Step.1|
Create new application.
 $ rails new <Application Name>

Step.2|
Open the Gemfile and append the following lines.
 $ vi Gemfile

 gem ‘execjs’
 gem ‘therubyracer’

 $ bundle install

:Step.3|
Launch application.
 $ cd <Application Name>
 $ rails server

:Step.4|
Access the following page.
 http://localhost:3000/
#ref(CreateApplication_fig1.png,,500x266,)

When you are setting portforwarding with rails4.2, localhost doesn't work by default. If you want to do port-forwarding, put the following option.

 $ rails start -b 0.0.0.0

Reference)
http://stackoverflow.com/questions/27799260/rails-4-2-server-port-forwarding-on-vagrant-does-not-work


**Create sample program with Scaffold [#t1863362]
:Step.1|
Create objects withs scaffold.
 $ rails generate scaffold <Object Name>
(Example)
 $ rails generate scaffold TestObject name:string

:Step.2|
Prepare database.

 $ rake db:migrate

:Step.3|
Launch the server and access http://<IP address>:3000/<Object Name>

#ref(CreateSample_fig1.png,,500x266,)

Now you have a page which maintains data stored in Sqlite DB.

**Create Say Hello program [#w1ae1718]
:Step.1|
Create controller and view files.
 $ rails generate controller <Controller Name> <Method(View)> <Method(View)>
(Example)
 $ rails generate controller Say hello goodbye

:Step.2|
Access the following page.
 http://localhost:3000/say/hello/
#ref(CreateApplication_fig2.png,,500x266,)


**Get data from RESTful service [#r4f6bb0b]
:Step.1|
Edit controller.

 $ vi app/controller/<Controller file>

    require 'open-uri'
    require 'json'
 
    res = open('<URL>')
    code, message = res.status
 
    if code == '200'
 
      @result = JSON.parse(res.read)
    end 

:Step.2|
Put it to view file.

 $ vi app/view/<View file>

 <table>
 <% @result.each do |data| %>
  <tr>
  <td><%= data['<Key#1>'] %></td>
  <td><%= data['<Key#2>'] %></td>
  </tr>
 <% end %>
 </table>


**Change table structures [#q88124d1]
:Step.1|
Create migration script

 $ rails g migration <Migration Script Name>

(Example)
 $ rails g migration AddColumnUsers

:Step.2|
Edit migration script.

 $ vi db/migrate/<Migration Script File Name>

(Example - change column)
 $ rails g migration db/migrate/20150927000024_add_column_workorders.rb

 class AddColumnWorkorders < ActiveRecord::Migration
   def change
     add_column :<table name>, :<column name>, :<data type>
     remove_column :<table name>, :<column name>
   end
 end


(Example - add foreign key)

 class AddForeignKeyStatements < ActiveRecord::Migration
   def change
     add_foreign_key :<referring table name>, :<referred table name>
   end
 end

If you set "statements" as referring table, and "calendars" as refered table, then your calendar_id in statements table will be set for foreign_key.


(Example - remove foreign key)

 class RemoveForeignKeyStatements < ActiveRecord::Migration
   def change
     remove_foreign_key :<referring table name>, :<referred table name>
   end
 end



:Step.3|
Setup database

 $ rake db:create
 $ rake db:migrate

:Step.4|
Edit index.html.erb

 $ vi app/views/<table>/index.html.erb

:Step.5|
Edit _form.html.erb

 $ vi app/views/<table>/_form.html.erb

 <%= f.label :<column> %>
 <%= f.text_field :<column> %>

:Step.6|
Edit conroller. After Rails is version up to 4.x, we can't use "attr_accessible", so we need to define as below instead.

 $ vi app/controller/<table name>_controller.rb

 def create
   attr = params.require(:<table name>).permit(:<column name>)
   @<table name> = <table name>.new(attr)


**DB Migration [#m6866a5d]
(Initilization)

 $ rake db:migrate

(Rollback)

 $ rake db:rollback

(DB Dump)

 $ rake db:schema:dump

(Drop Database)

 $ rake db:drop

(Load Dump file)

 $ rake db:setup

(Reset DB)

 $ rake db:reset

This is equivalent to "rake db:drop" with "rake db:setup".


**Testing [#l2ff40b5]
:Step.1|
Prepare test script.

default script)

 require 'test_helper'
 
 class <Class Name>ControllerTest < ActionController::TestCase
   # test "the truth" do
   #   assert true
   # end
 end

:Step.2|
Prepare test environment.
 
 $ rake db:test:prepare

:Step.3|
Execute test script.

 $ rake test


*Author [#l859f0e7]
S.Yatsuzuka