未分類

さくらのVPS-Ruby on Railsでテキスト入力・表示アプリ1(入力・表示)

今回は、さくらのVPS-Ruby on Railsにて、テキストを入力して、一覧表示する簡単なものを作ってみます。
現状はtest001という名前でrailsプロジェクトを作成し、MariaDBとの連携(rails db:create)まで完了しています。
前回のおさらい。
・さくらのVPS-Ruby on RailsとMariaDBを連携させる
https://koooza.net/2018/06/14/%E3%81%95%E3%81%8F%E3%82%89%E3%81%AEvps%EF%BC%8Druby-on-rails%E3%81%A8mariadb%E3%82%92%E9%80%A3%E6%90%BA%E3%81%95%E3%81%9B%E3%82%8B/

やること

1.Model作成
2.Routerの設定
3.Controllerの設定
4.Viewの設定
5. 新規入力機能の設定

1.Model作成

テキスト入力ということで、Textinという名前のモデルを作成する。

# rails g model Textin content:string
Running via Spring preloader in process 17291
      invoke  active_record
      create    db/migrate/20180613063119_create_textins.rb
      create    app/models/textin.rb
      invoke    test_unit
      create      test/models/textin_test.rb
      create      test/fixtures/textins.yml

マイグレーションファイルの確認

# more db/migrate/20180613063119_create_textins.rb
class CreateTextins < ActiveRecord::Migration[5.1]
  def change
    create_table :textins do |t|
      t.string :content

      t.timestamps
    end
  end
end

マイグレーションの実行

# rails db:migrate
== 20180613063119 CreateTextins: migrating ====================================
-- create_table(:textins)
   -> 0.0022s
== 20180613063119 CreateTextins: migrated (0.0023s) ===========================

成功!

MariaDBのテーブル確認

# mysql -u root -p
Enter password:
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 17
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
MariaDB [(none)]> show tables;
ERROR 1046 (3D000): No database selected
MariaDB [(none)]> show databases;
+---------------------+
| Database            |
+---------------------+
| information_schema  |
| db/test001_test     |
| mysql               |
| performance_schema  |
| test001_development |
+---------------------+
5 rows in set (0.00 sec)

MariaDB [(none)]> use test001_development
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [test001_development]>
MariaDB [test001_development]> show tables;
+-------------------------------+
| Tables_in_test001_development |
+-------------------------------+
| ar_internal_metadata          |
| schema_migrations             |
| textins                       |
+-------------------------------+
3 rows in set (0.00 sec)

textinsテーブルが作成された
テーブルのカラムも確認してみる。

MariaDB [test001_development]> describe textins
    -> ;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | bigint(20)   | NO   | PRI | NULL    | auto_increment |
| content    | varchar(255) | YES  |     | NULL    |                |
| created_at | datetime     | NO   |     | NULL    |                |
| updated_at | datetime     | NO   |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

MariaDB [test001_development]>

content カラムが作成されています。

次に試しに簡単な入力画面を作ってアクセスしてみる。

モデル一覧の確認

# rails c
Running via Spring preloader in process 17381
Loading development environment (Rails 5.1.6)
irb(main):001:0> Textin
=> Textin (call 'Textin.connection' to establish a connection)
irb(main):002:0> Textin.all
   (1.0ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
  Textin Load (0.8ms)  SELECT  `textins`.* FROM `textins` LIMIT 11
=> #
irb(main):003:0>

今は何も入っていない

モデルのインスタンスからデータベースへ保存する

# rails c
Running via Spring preloader in process 17417
Loading development environment (Rails 5.1.6)
irb(main):002:0> textin =Textin.new(content: 'test')
   (1.0ms)  SET NAMES utf8,  @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'),  @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483
=> #
irb(main):004:0> textin
=> #
irb(main):005:0>
irb(main):006:0* textin.save
   (0.5ms)  BEGIN
  SQL (0.9ms)  INSERT INTO `textins` (`content`, `created_at`, `updated_at`) VALUES ('test', '2018-06-13 06:43:01', '2018-06-13 06:43:01')
   (1.2ms)  COMMIT
=> true
irb(main):007:0>

データベースへカラムcontentの中身が「test」で保存できました。

2.Routerの設定

routingの編集
# vim config/routes.rb
Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

root to: 'textins#index'

resources :textins

end

太字部分を追加

ルーティングの確認

# rails routes
     Prefix Verb   URI Pattern                 Controller#Action
    textins GET    /textins(.:format)          textins#index
            POST   /textins(.:format)          textins#create
 new_textin GET    /textins/new(.:format)      textins#new
edit_textin GET    /textins/:id/edit(.:format) textins#edit
     textin GET    /textins/:id(.:format)      textins#show
            PATCH  /textins/:id(.:format)      textins#update
            PUT    /textins/:id(.:format)      textins#update
            DELETE /textins/:id(.:format)      textins#destroy

ちゃんと設定されています。

3.Controllerの設定

コントローラの作成

# rails g controller Textins
Running via Spring preloader in process 17664
      create  app/controllers/textins_controller.rb
      invoke  erb
      create    app/views/textins
      invoke  test_unit
      create    test/controllers/textins_controller_test.rb
      invoke  helper
      create    app/helpers/textins_helper.rb
      invoke    test_unit
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/textins.coffee
      invoke    scss
      create      app/assets/stylesheets/textins.scss

コントローラファイルの編集

# vim app/controllers/textins_controller.rb
class TextinsController < ApplicationController

# vim app/controllers/textins_controller.rb
class TextinsController < ApplicationController

def index
    @textins = Textin.all
  end

  def show
  end

  def new
  end

  def create
  end

  def edit
  end

  def update
  end

  def destroy
  end

end

太字部分を追加。
indexアクションにはモデルTextinの全リストを記載( Textin.all)

4.Viewの設定

Viewファイルの作成
indexアクションに対応するViewファイルを作成
空ファイルを作成

# touch app/views/textins/index.html.erb

作成したファイルを修正

# vim app/views/textins/index.html.erb
<h1>TEST TEXT</h1>

<ul>
  <% @textins.each do |textin| %>
    <li><%= textin.content %></li>
  <% end %>
</ul>

モデルtextinの中身を表示させる内容とする。

サーバにブラウザでアクセスしてみる。

無事、表示できました!!
先ほどDBに保存したcontentカラムの「text」が表示されています。
これでテキストを一覧表示するところまでできました。
今は、データベースに直接入力したものを表示するだけですが、
これにブラウザから入力したものを表示できるようにします。

5. 新規入力機能の設定

入力画面(new)の作成
Routerの確認

# rails routes
     Prefix Verb   URI Pattern                 Controller#Action
       root GET    /                           textins#index
    textins GET    /textins(.:format)          textins#index
            POST   /textins(.:format)          textins#create
 new_textin GET    /textins/new(.:format)      textins#new
edit_textin GET    /textins/:id/edit(.:format) textins#edit
     textin GET    /textins/:id(.:format)      textins#show
            PATCH  /textins/:id(.:format)      textins#update
            PUT    /textins/:id(.:format)      textins#update
            DELETE /textins/:id(.:format)      textins#destroy

newのルートは

new_textin GET    /textins/new(.:format)      textins#new

コントローラは、

# vim app/controllers/textins_controller.rb
def new
  end

の部分を

def new
    @textin = Textin.new
  end

へ編集

Viewの作成

# touch app/views/textins/new.html.erb
<h1>TEXT NEW</h1>

<%= form_for(@textin) do |f| %>
  <%= f.label :content, 'text'%>
  <%= f.text_field :content %>

  <%= f.submit 'submit' %>
<% end %>

<%= link_to 'TOP',textins_path %>

vimで日本語が文字化けしたので、タイトル等は日本語で表示させたかったのですが、今回は英語で対応する

画面表示してみる
http://サーバのアドレス:3000/textins/new
簡素な画面ですが、無事表示できた。

今のままだとブラウザにURLを直接入力しないと、この入力画面にいけないので、index(トップページ)に入力画面へのリンクをつける。

indexのVIEW

# vim app/views/textins/index.html.erb
<h1>TEST TEXT</h1>

<ul>
  <% @textins.each do |textin| %>
    <li><%= textin.content %></li>
  <% end %>
</ul>

<%= link_to 'link to text new', new_textin_path %>

最終行に太字部分を追加
new_textin_path はnewの画面へのパスという意味
これはRouterを見れば確認できる。
newのrouterは先ほどの

 new_textin GET    /textins/new(.:format)      textins#new

です。
Railsでは、頭に書かれている new_textin に_pathをつけると
それへのパスという意味になる。
なので今回は「new_textin_path」となる。

トップページを見てみる
link to text new というリンクが出てきた

「link to text new」をクリック
無事入力画面が出てきました。

次に入力したものをMariaDBへ保存するようにする。
Routerの確認

# rails routes
     Prefix Verb   URI Pattern                 Controller#Action
       root GET    /                           textins#index
    textins GET    /textins(.:format)          textins#index
            POST   /textins(.:format)          textins#create
 new_textin GET    /textins/new(.:format)      textins#new
edit_textin GET    /textins/:id/edit(.:format) textins#edit
     textin GET    /textins/:id(.:format)      textins#show
            PATCH  /textins/:id(.:format)      textins#update
            PUT    /textins/:id(.:format)      textins#update
            DELETE /textins/:id(.:format)      textins#destroy

DBへの保存は、POSTになるので

    POST   /textins(.:format)          textins#create

この行が該当。

次にコントローラ

# vim app/controllers/textins_controller.rb
  def create
  end

の部分を

  def create
    @textin = Textin.new(textin_params)
    @textin.save
    redirect_to :root
end

に更新し、

最終行に

  # Strong Parameter
  def textin_params
    params.require(:textin).permit(:content)
  end

を追加

ちなみに
# Strong Parameter
def textin_params
params.require(:textin).permit(:content)
end

この部分はストロングパラメータといって、入力欄のセキュリティを高めるためのやりかた。
通常だと入力欄にHTMLタグやスクリプトが入力されるとサーバが入力されたものを実行してしまう場合があるのですが、
それを一旦ストロングパラメータで対応し、サーバに実行されないように変更し、それをcreateアクションに渡すようにしています。

入力画面(new)に入力して、submitボタンをクリックしてみる。

トップの画面に戻り、入力した「rails text new」が表示された。

これでテキストを入力して、一覧表示できた。
次回は、表示したものを修正したり、削除したりできるようにしたいと思います。
このテキスト入力アプリができあがると、簡単なものですが、テキスト部分を変更し、TODOリストやタスクリストとして使えそう。

-未分類