Route設定を一つのファイルで複数行う v5.3
laravelのRouteについて誤認していたのでメモ。
きっかけ
route/web.phpに複数のURLを作ってそれぞれのページにアクセス
できなかったので試行錯誤していた話です。
⚠︎初心者なので間違いなどご指摘があると嬉しいです。
Before Code
これだとエラーでる。今思えばその通りだなって思う。
予測だけど無名関数2つ使うとおんなじ名前(無名)が2つあるよ!って怒ってたんだと思います。
(よくわかってない...)
//routes/web.php Route::get('/', function () { return view('welcome'); //default }); //hogeページのroute設定 Route::get('/hoge', function () { return 'hoge'; });
解決策
hogeControllerを作成
すると、 app/Http/Controllersの中に hogeControllerふぁいるが作成されます!
次にhogeページを作ります! resourceファイルの中に新しくhoge pageを追加しておきましょう。
hogeControllerにrouteの処理を書きます。
何も処理が書いてないと思うので、{ }中に 処理を書いていきましょう!
namespace App\Http\Controllers; use Illuminate\Http\Request; class hogeController extends Controller { public function hoge(){ return view('hoge'); //hogeページ } }
After Code
2つのrouteをかきたいときの書き方。
//routes/web.php Route::get('/', function () { return view('welcome'); //default }); //2page以上からのRouteの設定 の書き方 Route::get('/hoge', 'hogeController@hoge');
参考URL
versionが違うので気をつけてください。
初めてのLaravel 5.1 : (1) ページの表示フロー – ララ帳
Railsの会21,22,23日目[--sandbox/attr_accessor/find/update_attributes]
祝6章!!
今回の進捗です![認証システムについて]
今回は理解していない部分が多々あったため初歩的なところも記載しています。
6章で作るもの
・ユーザー用のデータモデルの作成(重要)
・データを保存する手段の確保について
最終目標は下の写真の機能を全て作ること!
OpenIDとOAuth
OpenID
ひとつのIDでさまざまなwebサービスの認証を実現する仕組み。システム のこと。
例
Google Account Authentication
livedoor Auth
はてな認証API etc...
OpenIDとは? | シックス・アパート - CMSソフトウェア、サービスを提供
OAuth (オーオース)
OAuthは,以下の特徴を持つ「認可情報の委譲」のための仕様。
簡単にいうと他サービス(OpenID)ユーザの権限の受け渡しを行ってくれる。
あらかじめ信頼関係を構築したサービス間でユーザの同意で認可情報を受け渡すため、サービスがユーザの認可のもとで
別のサービスの管理する情報(取得/追加/更新/削除など)を行えるようになる。
メリット
・ユーザが外部サービスにパスワードを教えることなく,細かく認可情報の委譲が可能。
(最低限必要な権限のみを委譲するように設定できる)例 有効期限、読み書き権限を限定
・認可情報の適用範囲を指定や有効期限を設定することができる。
・ユーザが外部サービスにすべての権限を渡すこと無いため、リスクを最小限に抑えることができる。
・オープンな仕様
スタブページとは
スタブページは、役立つ文書であるというには充分ではない記事のことです。おそらく後でコンテンツを追加しようとしたか、他のコミュニティメンバーが追加してくれるのを期待して作成されたページです。それをスタブページと呼んでいます。
Wiki: スタブページを作成するには (ja-JP) - TechNet Articles - United States (English) - TechNet Wiki
サードパーティーとは
他社の既に作られたシステムを使うこと。
例 外部の認証システム等
Userモデル作成
今のままでは新しいユーザーの情報を受け取っても保存する場所がないので、いきなりページを作成しません。
ユーザー登録でまず初めにやることは、それらの情報を保存するためのデータ構造を作成することです。
Ruby on Rails チュートリアル:実例を使って Rails を学ぼう
Railsでは、データベースを使用してデータを長期間保存します。
(DBとやりとりをするデフォルトのRailsライブラリはActive Recordと呼ばれます。)
Active Recordとは
データオブジェクトの作成/保存/検索のためのメソッドを持っています。
メソッドを使用するのに、リレーショナルデータベースで使うSQL (Structured Query Language)2 を意識する必要はありません。
Migration機能
データの定義をRubyで記述することができ、SQLのDDL (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の型とデータの中身(例)
attr_accessorとは
attr_accessorメソッドは、クラスやモジュールにインスタンス変数を読み書きするためのアクセサメソッドを定義します。
引数には、インスタンス変数名をシンボルか文字列で指定します(複数指定できます)。
戻り値はnilです。
attr_accessor (Module) - Rubyリファレンス
migrationでオブジェクトのもつ属性を定義することと同じ。
(migrationでは静的で、attr_accessorの型は動的に動きます)
使用例
・オブジェクトの属性を定義したい時
・(gemを作成する時、DBにアクセスする必要がない時)
アクセスメソッドの種類(3つ)
多くのインスタンス変数がある場合はメソッドを定義するだけでも大変なので、
インスタンス変数へ参照や更新が簡易的に行えるようにアクセスメソッドと呼ばれるものが用意されています。
インスタンスメソッドを用意しておくことでオブジェクトを経由してインスタンス変数の値を直接取得したり変更したりすることが出来ます。
⚠️クラス外からインスタンス変数が直接操作できるようになったわけではなく、参照や更新が行えるメソッドが自動的に作成されたと考えましょう!
アクセスメソッド - クラスの概念 - Ruby入門
Railsから入った人へ【attr_accessor】って? - Qiita
ActiveRecordとは
簡単にいうとobjectとdbの受け渡しを行う。
ActiveRecordはRuby 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"
Railsの会 20日目 [デバッグ(binding.pry /URL・path )]
そろそろゴールデンウィークが始まりますね!
今日の進捗です。
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/]
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
Railsの会18,19日目「bootstrap /partial /Sass 」
今日の範囲です。祝 5章!!!
今回はHTMLの部分は飛ばしているので部分的な説明になると思います。(レイアウトの話。)
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' %>
アセットパイプライン
静的ファイルを目的別に分類する3つのディレクトリが使用されている。
app /assets 現在アプリケーション固有のアセット lib /assets 開発チームにより作成されたライブラリ用アセット vendor /assets サードパーティのアセット
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; }
dockerのエラー(ポート)解決までの流れ
環境
docker 起動して いつものように 接続しようとすると
docker-compose up -d nginx redis
エラー文: 80番ポートが重複して起動できません!(写真とても見づらい...ごめんなさい!)
いつものコマンドが使えなくなっている...?!
Dockerのコンテナ消してもサーバ接続されているしどうゆうこと...?
となったので探す。
TCP探してkillを 繰り返してた 。
netstat -nlp | grep ':80' sudo lsof -i -n | grep TCP sudo kill 1810
対処法
sudo apachectl stop
もう一度起動します
解決!!!!!