Ruby on Rails 入門

未経験エンジニアがRuby on Railsを学習します

【初心者用】MySQLの基本コマンド@Userやtable作成まとめ

MySQLの基礎コマンドよく見失うのでメモ。

 

【やりたいこと】
rootで初回ログイン/パスワード設定
ユーザー作成(+権限付与)
database作成
table作成など
※前提:MySQLはダウンロード済み

①rootで初回ログイン/パスワード設定

mysql -u root

はじめはパスワードがないので、rootでログインします。
コマンドがmysql>になれば成功です。

次にパスワードの設定をします。

set password for 'root'@'localhost' = password('任意のパスワード');

 こちらで、ログアウトしてから再度ログインができれば成功です。

exit

mysql -u root -p #パスワードを使用してログイン

 パスワードを聞かれますので、先ほど設定したrootのパスワードで
ログインができれば成功です。

 

②ユーザー作成・ログイン〜権限付与

まずはrootでログイン。

mysql -u root -p

ログインができれば早速ユーザを作りましょう。

create user dbuser identified by '任意のパスワード';
#dbuser/passwordは任意のユーザー名・パスワードへ変更してください。

mysqlのコマンドは必ず最後に「 ; 」が必要になります。
Query, OK と出てこれば作成完了です。
一度ログアウトして、早速ログイン。 

exit;

mysql -u dbuser -p #dbuserというユーザ名と、パスワードを利用します

mysql>になっていればログイン成功です。
ですが、このユーザが権限を持っていないので、権限を付与します。
詳しい権限の種類やレベルは記載しませんが、
今回色々設定したいので全ての権限を付与します。

grant all on *.* to dbuser;

グローバルレベルのall権限が付与されました!

 

③database作成 

create database database_name; #database_nameは任意のdatabase名

ログイン後、databaseを作ります。
できたか確認します。

show databases;

できたか見てみます。これでdatabase一覧が見れます。

use database_name; #database_nameというデータベースを使う

そして、database_nameというデータベースに移動します。

 

④table作成

tableを作ります。
安定のcreate。

create table table_names(id int, name varchar(20));

tabel_namesは任意のテーブル名を設定ください。
カラムなどにいくつか規則があるのでご注意ください。
ここで、カラムと挿入するデータ型を指定します。

id = カラムの名前(任意) / int = 整数

のため、このときはidというカラムに整数のデータ型を入れる。
ex. id = 1 など

ということになります。あとはデータ型や特徴さえ掴めば
テーブルが作成できますね。

初心者がよく使うのは
int:整数 / varchar:文字列(255字まで) 

text:長い文字列(6万字くらいまで) / timestamp:日時 

などですが、詳しくは下記サイトをご参照ください。

MySQLのデータ型 - MySQLの使い方

show tables; 

 今どんなテーブルがあるのか見られます。
そして、先ほどのテーブルへ移動します。

use tables(任意のテーブル名);

テーブル構造を見たいときは

desc tables(任意のテーブル名);

f:id:fresh_engineer:20171108014448p:plain

こちらで見られます。

 

また、insertデータを入れた後は、

select * from tables;

 でも見れますし、整形して見たい場合は

select * from tables \G;

最後\Gをつけてあげると下記のような形で格納データが確認できます。
Macではoption+¥マークでバックスラッシュが入力できます。

f:id:fresh_engineer:20171108014635p:plain

以上です。

Ruby で  CSVファイル を処理するメモ

RubyでGoogle Spreadsheetを読み書きするメモ - Ruby on Rails 入門

 

上記記事の時、google spreadsheetからcsvファイルをダウンロードして
そのあとデータをjsonに整形することがあったのでメモ。

忘れないうちに自分用にメモさせていただきます

 

CSVからデータを取り出すにはRailsのtableとかforeachというメソッドが良いらしい。
tableはテーブル向けのインスタンスを返してくれるそうですが、
今回データを分けてHash化したかったので
foreachで1つ1つ取ってくる。

 

まず標準添付ライブラリのcsvjsonは使います

require 'csv'
require 'json'

 データを入れる用の配列を用意します

all = Array.new

hogehoges =

 

そして待ち焦がれたforeachの登場。
同フォルダ内のcsvファイルを読むよ、ヘッダーあるよ、dateに毎回入れるよ

CSV.foreach('table.csv',headers: true) do |data|
hogehoges.push data[1]
hogehoges.push data[2]
hogehoges.push data[3]
end

という感じ。
重複して欲しくなかったり分けたかったりしたので
compactやuniqを使用して最終的には下記になりました。
hashに全部入れて、jsonで返して終わりです。

#cording = UTF-8
require 'csv'
require 'json'
all = Array.new
hogehoges =

CSV.foreach('table.csv',headers: true) do |data|
hogehoges.push data[1]
hogehoges.push data[2]
hogehoges.push data[3]
end

newhogehoges =hogehoges.compact.uniq
x = 1
y = 0

newhogehoges.each do |neweq|
h = Hash["id", x, "name", neweq]
all.push(h)
x += 1
y += 1
end

puts all.to_json

 だいぶメモみたいになってしまったので時間あるときにでも
もう少し綺麗に書きます・・・多分

Ruby on RailsでCarrierWaveを使って画像投稿機能を実装する

【やりたいこと】

既存のwebアプリ(タスク管理アプリ)で画像を投稿できるようにしたい
( 既存で一通りのモデルとかビューはすでに作成済みの想定 )

【イメージ】

あまり湧いていないのですがcarrierwaveのgemを使用すると良いらしい。
既存でtitleの投稿機能は実装していたのでそれらに追加する形で実装します。

・gemをinstallする
・dbで画像を受け取れるようにする
・dbへ渡せるようモデルに追記する
・モデルへ渡すためのコントローラとビューを追加する
・dbから受け取った画像をビューで表示する画面を作る

 

【やってみる】

いつも通りvi GemfileでGemfileに追記、bundle installします。

gem 'carrierwave' 

bundle install 

これでcarrierwaveをインストール。
公式Githubに色々記載があります

rails g migraation AddpictureTotasks picture:string
#rails g migration Addカラム名(任意)Toテーブル名 カラム名:型

 rails db:migrate

これでdbのtaskテーブルに画像が追加できるようになりました。 

mysqlで叩いてみてもちゃんとpictureカラムが増えてる 

# mysqlにログインした後 

select * from tasks \G;

f:id:fresh_engineer:20170829001855p:plain

 こんな感じ。(投稿前はNILLになってるはず)

 

dbが用意できたのでdbへ渡すモデルを編集する

class Task < ActiveRecord::Base
mount_uploader :picture, PictureUploader
end

公式のGithubにもあった通りmount_uploaderというメソッドを使う。

 

画像をinputするためのviewを作成する。

<div class="field">
<%= f.label :picture %>
<%= f.file_field :picture %>
</div>

そのviewで受け取った画像をモデルへ渡すためにコントローラのparamにも
pictureを追加する

def task_params
params[:task].permit(:title, :picture)
end

これでcontrollerがpictureも渡してくれるようになりました

最後に受け取った画像を表示できるようviewを編集して終わり

<%= image_tag(@task.picture_url) if @task.picture.present? %>

以上で
画像をアップロード(view)→コントローラが受け取る→モデルが受け取る→dbへ渡す
リクエスト→dbから画像データを取ってくる→viewで表示する 

の完了です。

RubyでGoogle Spreadsheetを読み書きするメモ

【やりたいこと】
GoogleSpreadsheetにターミナルからアクセスをする。
様々な方法で挫折することも多々だったので現時点で上手くいった方法をメモ。

 ※Googleでログインしていて、
 任意のSpreadsheetにアクセスできる状態が前提です。

 

google_driveのgemを使うのが一番良さそう。

gem install google_drive

Githubに情報たくさん載ってました。
OAuth認証だと何かと怒られるのですが
config.jsonでアクセスすれば一発でした。

 

google_driveを呼び出して、config.jsonファイルにアクセスするrubyファイルを作成。

 

require "google_drive"
GoogleDrive::Session.from_config("google_drive_config.json")

実行する

ruby setup.rb

アクセスするURLが表示されるので、
アクセスして authorization codeをコピー・ターミナルで入力。
jsonファイルが作成されました。
一番早かったです。

アクセス方法などは下記記事参照。
config.jsonを呼び出して、キー指定、
もしくはGoogleDriveのフォルダやブック、シート名を指定すれば
一発で指定のワークシートへアクセスできます。

ws = session.spreadsheet_by_key("pz7XtlQC-PYx-jrVMJErTcg").worksheets[0]

 

参考にさせていただきました。
RubyからGoogleSpreadsheetに書く - お手軽編 - Qiita

公式Github
GitHub - gimite/google-drive-ruby: A Ruby library to read/write files/spreadsheets in Google Drive/Docs.

google-drive-ruby/authorization.md at master · gimite/google-drive-ruby · GitHub

公式ドキュメント
File: README — Documentation for google_drive (2.1.5)

 

GoogleSpreadsheetへの読み書きは、worksheetを定義した上で使用可能。
あるシートから別シートへデータを写したいときなどは下記などで実行できます。
以下割と使ったのでまとめ。

p worksheet[1,1] #1行1列目を表示
worksheet[1, 1] = "aaa" # 1行目1列目に書き込み

@item1 = worksheet[2, 1] 
#worksheetの2行目1列目のセルを@item1に代入
worksheet2[2, 2] = @item1 
#worksheet2のセル2行目2列目に@item1を代入
worksheet2.save
#保存

p worksheet.num_rows # レコード数を取得
p worksheet.num_cols # カラム数を取得 

 

以上メモでした

Ruby on Rails で 初心者がAjaxを使ってみる

 

【やりたいこと】

カテゴリーを変更すれば、Ajaxが 対応するカテゴリーのitem を取得し表示する。
※itemの部分のみが変更されるので、ページ変遷しない

【イメージ】
表示:ajax/search.html.erb
category1〜3で選択する
api/controllers/ajax.controllerが呼び出される
→projectモデルがprojectsテーブルからデータ取得する
→選択したcategory_id=?のデータを表示する
※一旦シンプルに考えるためにアソシエーション無視して
category_idで同テーブルのデータを使用することとします

まずはコントローラを作成、その後必要なビューとかを作ります。
部分テンプレートを使用しました。

部分テンプレートを使用すると
ファイル名の先頭に「 _ 」をつけるという制限があるので、
今回は下記の通りファイルを作成しました。

・controllers/ajax_controller.rb #rails g controller ajax 
・view/ajax/search.html.erb
・view/ajax/result.js.erb
・view/ajax/_search_result.html.erb

 

ajax_controller.rb

class AjaxController < ApplicationController
 def search
 @projects = Project.select(:category_id).distinct
 #表示するカテゴリー番号を取得
 end

 def result
 @projects = Project.where(category_id: params[:category_id])
 #指定されたカテゴリーIDでprojectsテーブルを検索
 end
end

 

search.html.erb

<%= form_tag({ action: 'result' }, remote: true) do %>
#view helperのform_tagは
#remoteオプションでsubmit時に非同期通信
<%= select_tag(:publish, options_from_collection_for_select(
@projects, :category_id, :category_id, '1')) %>
#option_from_collection_for_select = 選択肢をDBから生成するメソッド
<%= submit_tag '検索' %>
<% end %>

<ul id="result"></ul> 
#結果を反映する

 

_search_result.html.erb(部分テンプレート)

<% @projects.each do |project| %>
#取って来たproject itemを1つずつ下記project.titleへ出力
<li><%= link_to project.title,
'http://aaa.aa.aaa.aa/index' %></li>
<% end %>


result.js.erb(部分テンプレートが作った結果をJavaScriptで応答)

$('#result').html(
"<%= escape_javascript(render 'search_result') %>")
#受け取った結果をhtmlファイルへ変換

 

route.rb

get '/ajax/result'
post '/ajax/result'
get '/ajax/search'
post'/ajax/result'

 

ルートにこれ追加したら一応なんとかいけました。

f:id:fresh_engineer:20170806134151p:plain

 

できました !

 

f:id:fresh_engineer:20170806155457p:plain

 

Ruby on Railsでdevise使ってログイン機能を作る

Ruby on Railsでログイン機能を作ります。

何やらとても便利なdeviseというgemがあるそうなのでそれを使用します。

■ deviseをインストールする

vi Gemfile #Gemfileをvimで開く
gem 'devise' #deviseというgemをGemfileに記載する
bundle install #未インストールのgemfileをinstallする

 bundle installすると、gemの初期設定に必要な項目が表示されるので
それに沿って初期設定を実施します。

 

■ deviseの初期設定をする

1.認証URLの設定をする

config/environments/development.rbで下の方のurl_optionsを下記へ編集。

  config.action_mailer.default_url_options = { host: 'localhost:3000' }

私はさくらのVPSを使っていたので、 IPアドレス000.00.000.00:3000と記載しました。

2.rootの行き先を指定する/モデルとコントローラーを作る

すでにrootが設定されていれば必要ありませんので、rake routesで確認します。

rake routes #リクエストに対応する行き先を確認する

f:id:fresh_engineer:20170728214231p:plain

上記は設定されています。
rootの行き先が設定されて
もし設定されてない場合はroutes.rbへ

root 'home#index' #homeは任意です、この後のCとMは合わせます

 を追記ください。

次にコントローラーとモデルを作成します。

rails g controller Home index #規約でControllerの1文字目は大文字

rails g devise home #規約でmodelは小文字

rake db:migrate

 

3.ログインとサインアップへのリンク設置

indexにログインとサインアップの画面を作成します。
<body>〜</body>の間へ作成ください。

Logged in as <strong><%= current_user.email %></strong>.
<%= link_to "Settings", edit_user_registration_path, :class => "navbar-link" %> |
<%= link_to "Logout", destroy_user_session_path, method: :delete, :class => "navbar-link" %>
<% else %>
<%= link_to "Sign up", new_user_registration_path, :class => 'navbar-link' %> |
<%= link_to "Login", new_user_session_path, :class => 'navbar-link' %>
<% end %>

 そして、どのページでもログイン情報が画面に出力するよう、
application.html.erbへ下記を追加します。

<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>

 

■起動を確認する 

rails server -b 0.0.0.0

 サーバーを起動し、localhost:3000へアクセス。
Sign upで自分の任意のアドレスを入力ください。

 

f:id:fresh_engineer:20170728222052p:plain

 

任意のアドレスにメールが届くので、
Confirm my accountをクリックし認証。

f:id:fresh_engineer:20170728222540p:plain

ログイン画面でログインができれば成功です。

 

ちなみにデータはmodel作成時にできたテーブルで確認できるので
mysqlを立ち上げ、use データベース名 -> select * from テーブル名 \G;により
sign up したデータを確認できます。

f:id:fresh_engineer:20170728223030p:plain

メールの認証ができていれば、confirmedの2箇所に
token付与、日時が記載されているはずです。 

 

カスタマイズなどはViewを作成してカスタマイズください。

以上です。

Ruby on Rails初心者がMVCについて整理する

この記事では、Ruby on Railsを用いて何かを作った時

どんな流れで何を作ってるのかを初心者なりに整理します。

 

イメージは

リクエス
→Routeでリクエストに対するController/action呼ぶ
→Controllerでaction呼ぶ→model→DBへデータ取りに行く
→modelが取ってきたデータをControllerに返す
→ViewもしくはViewなしでクライアントへレスポンス返す

f:id:fresh_engineer:20170727134141p:plain

 

こんな形のイメージです。
早速作ってみます。
 

rails new アプリケーション名(任意) [options]

 アプリケーションを作成するrails newコマンドです。
rails newコマンドによって、沢山のファイルとフォルダが作成されています。

まずはモデルを作成、

rails g model モデル名 #モデルは単数形で、1文字目が大文字

rails db:migrate 

 

次に、コントローラーとビューを作成します。

 

rails generate controller コントローラー名(任意) [options]
#コントローラーは複数形で、1文字目が大文字

例えばprojectsというコントローラー名でコントローラを作成します。
この時ビューも作成されます。

※ルールではありませんが、コントローラ名はリソース(操作対象のデータ)の
名前に沿って命名するのが望ましいそうです。
今回はprojectsテーブルを操作するためのコントローラであることを想定。

ここまで作成できれば、app/config/routes.rbのRouteを設定します。
詳しい設定の仕方は次回以降記載します。

routeを設定したら、

rake routes

ここで、リクエストに対してどのコントローラーのどのアクションが
呼び出されるか確認できます。下記が例。f:id:fresh_engineer:20170727230334p:plain