キリンめも(技術)

記事を書いています #rails #swift #JS #UE4 #unity

Railsの会21,22,23日目[--sandbox/attr_accessor/find/update_attributes]

祝6章!!
今回の進捗です![認証システムについて]
今回は理解していない部分が多々あったため初歩的なところも記載しています。

f:id:geta206:20170501192819p:plain

6章で作るもの

・ユーザー用のデータモデルの作成(重要)
・データを保存する手段の確保について
 最終目標は下の写真の機能を全て作ること!

f:id:geta206:20170508183216p:plain

OpenIDとOAuth

OpenID

ひとつのIDでさまざまなwebサービスの認証を実現する仕組み。システム のこと。

Google Account Authentication
livedoor Auth
はてな認証API  etc...
OpenIDとは? | シックス・アパート - CMSソフトウェア、サービスを提供

OAuth (オーオース)

OAuthは,以下の特徴を持つ「認可情報の委譲」のための仕様。
簡単にいうと他サービス(OpenID)ユーザの権限の受け渡しを行ってくれる。

あらかじめ信頼関係を構築したサービス間でユーザの同意で認可情報を受け渡すため、サービスがユーザの認可のもとで
別のサービスの管理する情報(取得/追加/更新/削除など)を行えるようになる。
メリット
・ユーザが外部サービスにパスワードを教えることなく,細かく認可情報の委譲が可能。
 (最低限必要な権限のみを委譲するように設定できる)例 有効期限、読み書き権限を限定
・認可情報の適用範囲を指定や有効期限を設定することができる。
・ユーザが外部サービスにすべての権限を渡すこと無いため、リスクを最小限に抑えることができる。
・オープンな仕様

使用例

外部サービスにfacebookのアドレス帳へのアクセス権限を与えたいとき,そのサービスにfacebookのメールアドレス&パスワードを教えてしまうと,それらの情報が他のGoogleサービスでも悪用される危険性がある。(外部サービスにパスワードを変更、アカウント乗っ取り等)

認可情報の委譲を行う似たような仕様には,GoogleYahoo!FlickrFacebookなどが独自に提供しているものもありますが、
OAuthがそれらと大きく違うのは,仕様がオープンなことです。(読み書き可能なのか等明確に記載されている)

OAuthのサポート

GoogleYahoo!TwitterなどのAPIでも独自認証やBasic認証と併用する形で使用されています。
第1回 OAuthとは?―OAuthの概念とOAuthでできること:ゼロから学ぶOAuth|gihyo.jp … 技術評論社

スタブページとは

スタブページは、役立つ文書であるというには充分ではない記事のことです。おそらく後でコンテンツを追加しようとしたか、他のコミュニティメンバーが追加してくれるのを期待して作成されたページです。それをスタブページと呼んでいます。
Wiki: スタブページを作成するには (ja-JP) - TechNet Articles - United States (English) - TechNet Wiki

パーミッションの権限についておさらい

rwx
r 所有者 /w グループ権限 / x 他のユーザ権限

read(読み) write(書き) execute (実行)

計算方法!
f:id:geta206:20170506010508p:plain

サードパーティーとは

他社の既に作られたシステムを使うこと。
例 外部の認証システム等

Userモデル作成

今のままでは新しいユーザーの情報を受け取っても保存する場所がないので、いきなりページを作成しません。
ユーザー登録でまず初めにやることは、それらの情報を保存するためのデータ構造を作成することです。

Ruby on Rails チュートリアル:実例を使って Rails を学ぼう

Railsでは、データベースを使用してデータを長期間保存します。
  (DBとやりとりをするデフォルトのRailsライブラリはActive Recordと呼ばれます。)

Active Recordとは

データオブジェクトの作成/保存/検索のためのメソッドを持っています。
メソッドを使用するのに、リレーショナルデータベースで使うSQL (Structured Query Language)2 を意識する必要はありません。

Migration機能

データの定義をRubyで記述することができ、SQLDDL (Data Definition Language) を新たに学ぶ必要がありません。


RailsはDBの細部は隠蔽していて、切り離して使用することができます!!
なので本番環境のデータ保存の詳細について考える必要はほとんどありません!

nameとemailの2つの属性からなるユーザーをモデリングするところから始めましょう!
後者のemailを一意のユーザー名として使用します。

user とemailのカラムを持つUserテーブルを作ります!
Railsでユーザーをモデリングするときは、属性を明示的に識別する必要がありません。
Railsはデータを保存はデフォルトでリレーショナルデータベースを使用します!

class User
  attr_accessor :name, :email
  .
  .
  .
end

この時点でnameやemailといったカラム名を今のうちに考えておくこと、
後でUserオブジェクトの各属性をActiveRecordに伝えるときに楽になるらしい!

DBの型とデータの中身(例)

f:id:geta206:20170508194717p:plain  f:id:geta206:20170508194748p:plain

attr_accessorとは

attr_accessorメソッドは、クラスやモジュールにインスタンス変数を読み書きするためのアクセサメソッドを定義します。
引数には、インスタンス変数名をシンボルか文字列で指定します(複数指定できます)。
戻り値はnilです。

attr_accessor (Module) - Rubyリファレンス




migrationでオブジェクトのもつ属性を定義することと同じ。
 (migrationでは静的で、attr_accessorの型は動的に動きます)

使用例
・オブジェクトの属性を定義したい時
・(gemを作成する時、DBにアクセスする必要がない時)

アクセスメソッドの種類(3つ)

多くのインスタンス変数がある場合はメソッドを定義するだけでも大変なので、
インスタンス変数へ参照や更新が簡易的に行えるようにアクセスメソッドと呼ばれるものが用意されています。

f:id:geta206:20170508200308p:plain
インスタンスメソッドを用意しておくことでオブジェクトを経由してインスタンス変数の値を直接取得したり変更したりすることが出来ます。
⚠️クラス外からインスタンス変数が直接操作できるようになったわけではなく、参照や更新が行えるメソッドが自動的に作成されたと考えましょう!


アクセスメソッド - クラスの概念 - Ruby入門
Railsから入った人へ【attr_accessor】って? - Qiita


ActiveRecordとは

簡単にいうとobjectとdbの受け渡しを行う。

ActiveRecordRuby on Railsを構成する最も重要なライブラリの1つで、Railsのモデル層に相当し、O/Rマッピングを担当します 。
ActiveRecordライブラリも、これに沿うものとなっております。

ActiveRecord::Baseの派生クラスとして実装し、app/models配下に格納します。
モデルクラスには、そのモデルの表すデータに関連したドメイン固有のロジックを追加できるので、
オブジェクト指向的なプログラミングを行えます。

Ruby on Rails3で学ぶWeb開発のキホン(3):「ActiveRecord」の基本とデータの参照 (1/2) - @IT

O/Rマッピングとは

リレーショナルデータベースのレコードをオブジェクトとして直感的に扱えるようになり、
RDBへアクセスするプログラムを記述する際の煩雑な処理を軽減することができるようになります。
Hibernateで理解するO/Rマッピング(1):O/Rマッピングの役割とメリット - @IT

vaild?

Active Recordのvalidation(検証) 機能を使用して、オブジェクトがDBに保存される前にオブジェクトの状態を検証する。
nameというオブジェクトの中に文字列以外のデータが入るのか確認しています。

class Person < ActiveRecord::Base
  validates :name, presence: true
end
 
Person.create(name: "John Doe").valid?  
=> true
Person.create(name: nil).valid? 
=> false

SQLite3

RailsのDBは今回SQLite使っているのでメモ。
railsチュートリアルの本番環境ではPostgreSQLで使用するらしい。。

順序 

#1 Userモデル作成
$ rails generate model User name:string email:string  
      invoke  active_record
      create    db/migrate/20160523010738_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml

#2 マイグレーションの適用
$ rails db:migrate

#3 Userオブジェクトの作成
$ rails c

#4 DBに値を入れる
>> user = User.new(name: "Michael Hartl", email: "mhartl@example.com")
=> #<User id: nil, name: "Michael Hartl", email: "mhartl@example.com", created_at: nil, updated_at: nil>

#5 保存する
>> user.save
   (0.1ms)  SAVEPOINT active_record_1
  SQL (0.8ms)  INSERT INTO "users" ("name", "email", "created_at",
  "updated_at") VALUES (?, ?, ?, ?)  [["name", "Michael Hartl"],
  ["email", "mhartl@example.com"], ["created_at", 2016-05-23 19:05:58 UTC],
  ["updated_at", 2016-05-23 19:05:58 UTC]]
   (0.1ms)  RELEASE SAVEPOINT active_record_1
=> true

#確認
>> user.name
=> "Michael Hartl"
>> user.email
=> "mhartl@example.com"

はじめてのSQLite(Mac版) | データベース | DoRuby
Macで使うSQLite3入門編 - TASK NOTES

find

Active Recordのオブジェクトを検索するための方法。

# IDの1一番目を検索しています
>> User.find(1)
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 19:05:58", updated_at: "2016-05-23 19:05:58">

# 特定の属性でユーザーを検索
>> User.find_by(email: "mhartl@example.com")
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 19:05:58", updated_at: "2016-05-23 19:05:58">

#他の検索方法

#IDの1番目を検索
>> User.first
=> #<User id: 1, name: "Michael Hartl", email: "mhartl@example.com",
created_at: "2016-05-23 19:05:58", updated_at: "2016-05-23 19:05:58">

#全てのIDの検索結果を表示
>> User.all
=> #<ActiveRecord::Relation [#<User id: 1, name: "Michael Hartl",
email: "mhartl@example.com", created_at: "2016-05-23 19:05:58",
updated_at: "2016-05-23 19:05:58">, #<User id: 2, name: "A Nother",
email: "another@example.org", created_at: "2016-05-23 19:18:46",
updated_at: "2016-05-23 19:18:46">]

#属性を更新する別の方法は、[ update_attributes ]
>> user.update_attributes(name: "The Dude", email: "dude@abides.org")
=> true
>> user.name
=> "The Dude"
>> user.email
=> "dude@abides.org"

update_attributes

データベースから取得したオブジェクトを更新
⚠️保存時に validation を行いません。

>> user.update_attribute(:name, "El Duderino")
=> true
>> user.name
=> "El Duderino"

update_attributes - リファレンス - - Railsドキュメント

応用問題(復習)

問題  name がhogeの人の人を探し、探してきたnameの値をfuga に変更するにはどのように記述すればよいでしょうか?
※一行だけ 2行でも可


答え:
1 一行で書く方法
User.find_by(name: "hoge").update_attributes(name: "fuga")

2 代入して使う
pry(main)> user = User.find_by(name: "hoge")
pry(main)> user.update_attributes(name:"fuga")
検索とupdate

Railsの会 20日目 [デバッグ(binding.pry /URL・path )]

そろそろゴールデンウィークが始まりますね!

今日の進捗です。
f:id:geta206:20170501191522p:plain

pathの書き方

2パターンあります。
1, まとめて書く方法
rootメソッドを使い、ルートURL”/”をコントローラで紐付けしています。

  get 'static_pages/help'

2, よく使われる書き方(toの後ろに場所指定してます)
_pathの規則に従った書き方。

   get  '/help', to: 'static_pages#help'

root_path と root_urlの違い

pathとは?
_pathはドメイン名から下のパスのみ。

/login/id/2

urlとは?
_urlはhttp://などから始まる全てが書かれている

[http://pinamemo.hatenablog.com/]


f:id:geta206:20170501185344p:plain




binding.pry

「5.3.3 名前付きルート」の部分でurlの確認ができなかったので導入しました。

これを導入するとブレイクポイントを設置することができる!
xcodeのようにデバッグできるのは嬉しい

  2: def home
 => 3: binding.pry
  4: end

=> の部分で処理が止まる
※一時停止しているだけ

メリットは変数の中身を調べることもできる!

  pry(main)> home
=> 1234

そのほかに使用できるコマンドは..?

next
次の行を実行
step
次の行かメソッド内に入る
continue
プログラムの実行をcontinueしてpryを終了
finish
現在のフレームが終わるまで実行

a[href=?]

?の中にroot_pathがはいる。 count:2 は検索数の指定をしている。

 assert_select "a[href=?]", root_path, count: 2

rake routes

既存のルーティング情報を探すときに使う。

$rake routes  


結果

 Prefix Verb URI Pattern Controller#Action
  root GET / static_pages#home
  help GET /help(.:format) static_pages#help
  about GET /about(.:format) static_pages#about
contact GET /contact(.:format) static_pages#contact

参考URL
Rails のルーティング | Rails ガイド

Railsの会18,19日目「bootstrap /partial /Sass 」

今日の範囲です。祝 5章!!!
今回はHTMLの部分は飛ばしているので部分的な説明になると思います。(レイアウトの話。)

f:id:geta206:20170411193012p:plain

IEの処理

IEに対応することがなければ記述しなくて大丈夫

<!--[if lt IE 9]>
  <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/r29/html5.min.js">
  </script>
<![endif]-->

imageタグ

画像のリンク貼る link_toに link_tagを貼る

image_tag(画像ファイルへのパス, [, (オプション or HTMLオプション)])
<%= link_to image_tag("rails.png", alt: "Rails logo"),'http://rubyonrails.org/' %>

ファイル場所 app /assets /images/

ファイル名が重ならないようにRailsが文字列を追加している
もしRailsの写真使いたい時はu9jfoshfiu90...文字をそのままコピーして使わないといけない。

Bootstrap を作る

 @import "bootstrap-sprockets";
 @import "bootstrap";

CSS復習

/*テキストの大文字・小文字を指定する [upperdcase : 全て大文字で表示]*/
 text-transform :uppercase;
/*フォントの太さを指定[bold: 一般的な太さ]*/
font-weight :bold;
/*テキストの下線・打ち消し線等を指定[none: 何も表示しない(初期値) ]*/
text-decoration: none;

partial (パーシャル)

部分テンプレートまたはパーシャルは、出力を扱いやすく分割するための仕組みです。パーシャルを使用することで、ビュー内のコードをいくつものファイルに分割して書き出し、他のテンプレートでも使いまわすことができます。

ルール: 出力(viewの一部)するには、viewでrender メソッドを使用します。

 <%= render "menu" %>


読み込む場所 app/views/layouts/apprication.html.erb

<%=render 'layouts/footer' %>

Action View の概要 | Rails ガイド

アセットパイプライン

静的ファイルを目的別に分類する3つのディレクトリが使用されている。

  app /assets          現在アプリケーション固有のアセット
  lib  /assets           開発チームにより作成されたライブラリ用アセット
  vendor /assets     サードパーティのアセット
マニフェストファイル

app/assets/stylesheets/application.css

*=require_tree,
*=require_self

引数として与えられたディレクトリ下を再帰的に全てを検索する。

 *= require_tree . 

require_self呼び出しの時にCSSがあれば読み込む。
複数のディレクティブを記述しているとき、読み込まれる順番を指定したい場合に利用します。

 *= require_self

Sass

Sassの使い方について紹介します!
通常の書き方 

#logo{                  
float: left;
   ...
}

#logo:hover {
  color: #fff;
}

1. Sassの書き方をすると入れ子にできます

#logo {
  float: left;
  &:hover {
    color:#fff;
  }
}

2. 他には bootstrap-sass というgemを利用すると、変数を作れます!
LESS変数一覧: Customize and download · Bootstrap
LESSとSassの変数の見分け方
LESS: @
Sass: $

使用例

$light-gray: #777;

h2{
 color: $light-gray;
}

Railsでページごとのscssを管理する方法 -- blog.10rane.com

dockerのエラー(ポート)解決までの流れ

環境

・docker for mac
macOS Sierra


docker 起動して いつものように 接続しようとすると

docker-compose up -d nginx redis


エラー文: 80番ポートが重複して起動できません!(写真とても見づらい...ごめんなさい!)
f:id:geta206:20170405172112p:plain

いつものコマンドが使えなくなっている...?!

Dockerのコンテナ消してもサーバ接続されているしどうゆうこと...?
となったので探す。
TCP探してkillを 繰り返してた 。

netstat -nlp | grep  ':80'
sudo lsof -i -n  | grep TCP

sudo kill 1810

原因

Macに搭載されているApache自動起動していることが原因でした

対処法

sudo apachectl stop

もう一度起動します
解決!!!!!

dump.sql を再読み込みにエラーが出た時の対処法

sql文はあっているはずなのにdumpしたらerrorが表示されるってことありますよね!

こんな感じで

ERROR:  column "id" of relation "column_id" does not exist

そんな時のコードはこちら

drop schema public cascade;
create schema public;

posticoで実証済みです。
手順
1 前のデータを消去
2 再度読み込み
の順番で 作るとうまくできます。