テックエキスパート6日目終了です。カリキュラムの進行具合に余裕が出てきたので気持ち的にも余裕が出てきました。
これくらいの余裕を持って、カリキュラム以外のところでもプログラミングを学んでいけたらなと思います。
今日の気になるトピック:イーロンマスク
今日の気になるトピックとしては、先日イーロンマスクが発表した脳に埋め込むチップでしょうか。
イーロン・マスクのNeuralinkは来年から人間の脳とのより高速な入出力を始める
来年にも人間で実証実験を行うといったことも発表されていました。ここにどんなプログラムが仕込まれているのか全く想像もつきませんが、この辺りのこともすこしずつ分かってくるともっとプログラミングが楽しくなるのかなと思ったりします。
ちなみにこれ、脳に実際に髪の毛より細いものを埋め込むのですが、人間の手で埋め込むのは不可能なので、それ用のロボットも開発中とのこと。。恐ろしいですね。
ついに始まる、脳直結インターフェースの時代。イーロン・マスクのAI危機対策として
備忘録コーナー
それでは恒例ですが、備忘録をつらつらと書き記していきたいなと思います。
rake routesでルーティングを確認
rake routesと入力すればconfig/routes.rbに記載されているルーティングを確認することができる。
これはprefixURLを確認する時やエラーなどが起きている時に確認すると有効そう。
link_toメソッド
このメソッドは見て字のごとくリンクを設定する時に使うタグですね。
<%= link_to "リンク名", "URLまたはパス"%>
またメソッドを追加することも可能。
もし追加しない場合はgetになる。
<%= link_to "リンク名", "URL", method: :post %>
参考記事:https://udemy.benesse.co.jp/development/web/link-to.html
後置ifで簡潔に
elseやelseifといった分岐がなく処理が1行で終わる場合には、endを省略してifを後ろにつけて終わりにすることができる。
例 user.delete if current_user == user.find(1)
フォームの初期値
フォームの初期値に何か入れておきたい場合は、input要素の場合はvalue属性に設定。textareaなどはタグの間。
参考記事:https://happy-teeth.hatenablog.com/entry/2018/12/28/180747
updateメソッド
updateメソッドはacctiveRecordの1つ。モデルのインスタンスに対して使用し、情報を更新することができる。
update(カラム名: 更新内容, カラム名: 更新内容) イメージはcreateメソッドに近い。
resourcesメソッド
railsの基本的なroutingを自動生成してくれるメソッド。Railsではget ~ #showなどのルーティングやアクションを設定してくれますが、このresourcesアクションを入れればその辺の設定を自動でやってくれます。
自動生成されるのは下記のルーティング
index, show,new, create, edit, update, destroy
使い方
routes.rbにresources :コントローラー名を記載するのみ。
ただし7つ全てに対応するアクションが設定されていないとエラーとなる。その場合は :only {:メソッド名}で制限をかける必要がある。
ルーティングのネスト
ルーティングのネストとは あるコントローラーのルーティングの記述の中に別のルーティングの記述を入れ子構造で入れることにより、通常は繋がっていなかったルーティングを結びつけることができる。
アソシエーションがテーブルの入れ子で、こっちはルーティングの入れ子みたいなイメージ。
このネストの目的はアソシエーション先のレコードのidをparamsに追加してコントローラーに送るため。
例えばuserコントローラーとcommentコントローラーがあった場合、commentのルート(…./comments/)にuser id情報を乗っけるのはできない。しかしルーティングをネストしていればその情報も含んでルーティングすることができる。
user/ :id /commentsみたいな。ちょっとここ自信ないので要復習。
記載方法 場所はroutes.rb
resources コントローラー名 do
resources コントローラー名
end
部分テンプレート
Railsでは同じHTML構造を繰り返し使うような記述を部分テンプレートして扱うことがあります。
この部分テンプレートを使うことによって、コードがすっきりすることに加え、修正等が発生した際も必要最低限の修正で済みます。
部分テンプレートの設定
そんな部分テンプレートですが、設定は非常に簡単でファイル名を「_」で始めるだけ。あとはそれを読み込むだけです。
部分テンプレートの読み込みには「renderのpartialオプション」を使用
部分テンプレートを使用する際にはrenderにメソッドにpartialオプションを付ければOKです。
_index.html.erbを使う場合
render partial: "index"
localsオプション
renderにはlocalオプションというものもあります。これは何ができるかというと、部分テンプレート内で使いたい変数を定義することができます。
render partial: 'ファイル名', locals: { '部分テンプレートで使う変数': '変数に入れる値' }
例を出すと以下のようになります。
render partial: "index", locals: { post: "hello!" }
省略も可能
render partial: 'index', post: hello!
実際の使用イメージ
コントローラー
def new
@post = Post.new
end
def edit
@post = Post.find(params[:id])
end
new.html
<%= form_for @post do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<% end %>
edit.html
<%= form_for @post do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<% end %>
_form.html.erb
<%= form_for post do |f| %>
<%= f.label :name %>
<%= f.text_field :name %>
<% end %>
<%= render partial: 'form', locals: { post: @post } %>
先ほどの長いフォームをこの1行に書き換えることができた。ここで注意すべきなのが、@postの代わりにpostという値を部分テンプレートで使っているよ、という記述。これによって部分テンプレートでもコントローラーで定義した変数を使うことができる。
繰り返し処理をするときにも活躍
<% @post.each do | post | %>
<%=post.text%> ←
<%=post.image%> ←この部分をテンプレ
<%=post.name %> ←
<%end%>
<%= render partial:'form', locals:{post: post} %>
_formフォルダ内
<%= post.text %>
<%= psot.image %>
<%= post.name %>
ヘルパーメソッド devise_for でログイン周りのルーティング作成
はい、そのままです。内容確認したい場合は rake routesで ※必要に応じて bundle exerc を前につける。
Git
Gitはソースコードの変更履歴やバージョン等を管理・記録できるツール。Gitは今や多くの企業でも開発の際などに使われているようですが、何が良いのかと言うと「変更履歴が全て保存される」「前の履歴に戻れる」 「チームメンバーに共有できる」
まあ簡単に言うと、チームビルディグで分割作業が円滑に行えるようにする管理ツールというところでしょうか。
Githubとは
で、この名前の付いたGithubというサービスがあります。これは、Gitの仕組みを利用して、世界中の人々が自分のプログラムコードやデザインデータなどを保存、公開できるようにしたウェブサービスの名称です。
Githubにあるコードを使う方法
git clone リポジトリURL ディレクトリ名という形でターミナルで実行するとダウンロード可能。
参考記事;https://www.sejuku.net/blog/7901
bundle show [gemの名前]でgemの場所確認
インストールしたgemはRubyのバージョンごとに保存されており、その場所を確認するにはbundle show[gem名]で見れる。
bundle execの必要性
2つ以上のRailsを同じバージョンのRubyで作成している場合は rake db:migrateなどをした際にエラーが出る可能性があるので bundle exerc を前につけて行う。
これの意味はGemfileで指定した環境下のrakeコマンドとして実行する。
もう少し簡単に言うと、2つ以上何かを進行している時というのはRailsを含めGemのバージョンが異なる可能性が出てきます。(例えば1つのrailsが1つ前で、もう1つのrailsが最新など)
そうなるとエラーが起きるのでbundle exercをするとgemfileにここではこのバージョンというように指定をしてくれるのでエラーが起きないそう。
参考記事:https://qiita.com/diskkid/items/0d000a42df04c561ca0f
スクレイピング
スクレイピングというのはウェブサイト上のHTMLから特定の情報を抜き出すこと。スクレイピングのざっとした手順は以下。
①gemの追記
②バンドルインストール
③インスタンス生成(new,crearte
④getメソッドを使う
⑤searchメソッドを使って配列で取得
⑥inner_textメソッドで中身のみ取得
※リンク先だけ取りたい場合などは.get _attribute(‘hre)などを使う
①Mechanize Gem
Mechanaizeというgemはスクレイピングを行うためのgem。このgemを入れることで様々なメソッドを利用可能。
③インスタンス生成
スクレイピングを行うためにはMechanaizeクラスのインスタンスを生成する必要がある。
agent = Mechanize.newのようにしてインスタンスを生成する。
④getメソッドを使う
getはMechanizeクラスのインスタンスメソッドで以下のようにして利用可能。
page(任意の変数)=agent(インスタンス).get("スクレイピングしたいウェブサイトのURL")
これによって指定のURLのHTMLを取得可能。しかしHTMLを取得しただけでは、無駄が多いのでもう少し詳しく情報を取得していく。ちなみにこの時取得するのは文字列ではなくHTMLの情報を持った Mechanize: :pageオブジェクトであることに注意。
⑤searchメソッドを使って配列で取得
searchメソッドはgetで取得したオブジェクトに対し使用可能。このメソッドを使うことで指定したHTML要素を取得可能。
ちなみに取得した情報は配列の形で取得されることに注意。
elements=page.search(‘取りたいHTML要素’)
取りたいHTML要素に関しては h1やaタグ、classなども取得可能。classは「.クラス名」と入れることに注意。
要素が1個しかいらない場合はatメソッドも使える
atメソッドは最初の1つのみ取得するメソッド。なので⑥で解説する繰り返しメソッドは不要となる。
⑥inner_textメソッドで中身のみ取得
⑤で取得できた情報はまだタグが付いた状態。ここからテキスト要素だけ取り出すためにはinner_textメソッドを使用する。またその際eachメソッドを使って1つ1つ出力した上でinnner_textとすることで、同じ要素を持つ情報を多数取得できる。
agent = Mechanize.new
page = agent.get("取得したいリンク")
elements = page.search('要素')
elements.each do |element|
puts element.inner_text
end
get_attributeメソッド
テキスト要素ではなくaタグのように属性要素を取得したい際にはget_attriubuteメソッドを使って取得することができる。
上のコードからこう変更する
element.get_attribute('href')
URLを取得した際、相対パスになっていることが多いので、そのまま何かのオブジェクトに入れて飛ばしたりはできない可能性があるのでパスに注意。
モデルを作る際のマイグレーションファイルの書き方
モデルを作る際、ターミナルでカラム名や型などを指示しない場合は、マイグレーションファイルに記載してrake db:migrateする必要がある。
その際の書き方は下記になる。
def change
user_table :users do |t|
t.string(カラムの型) :カラム名
t.text :image_url
t.timestamps
end
end
reload!
rails cの最中にコードを修正したり追記したりする際にコンソールはリアルタイムに修正を反映できない。
そういった場合、一度exitする必要があるが、reload!コマンドを実行すれば再起動する必要がないので便利。
first_or_initializeメソッド
テーブルにそのレコードがあれば、そのレコードのインスタンスを返し、なければnewしてくれるメソッド。 newするだけで保存してくれていないので注意が必要。
findメソッドやwhereメソッドなどとともに使うパターン。
post=Post.where(name: “Ozaki”).first_or_initialize
forやwhileを止めるbreak
forやwhileなどのループを強制的に止めるのがbreak。
unless next_page
break
end
カラムの追加・削除
カラムの追加や削除はターミナルからもできるが、ここではマイグレーションファイルのchangeメソッドに記載する方法で解説。
追加の場合
add_column :テーブル名, :カラム名, :カラムの型
削除の場合
removeにする。
あいまい検索 LIKE
あいまい検索をする際にはモデルクラス名.where(‘検索するカラム名 LIKE(?)’, “検索するキーワード”)を使う。
その時、あいまい検索の仕方に注意。以下の通り。
あ で始まる文字列
@post = Post.where('titleカラム LIKE(?)', "あ%")
いで終わる文字列
@post = Post.where('titleカラム LIKE(?)', "%い")
ユーザーが入力した文字を曖昧検索に回したい場合
この場合は、入力フォームと曖昧検索を使えばOK。
Product.where('title LIKE(?)', "%#{params[:word]}%")
入力内容をparamsで受け取る。
wordはハッシュのキーなので設定次第。
%で挟めば入力した文字が含まれる任意のキーワードを
検索できる。
avarageメソッドで平均値を取得!
avarageメソッドでは平均値を取得することができる。
posts=Post.all
posts.avarage(:取りたいカラム名!)
四捨五入はroundメソッドを使う
数値に小数点が入り、四捨五入したい場合はroundメソッドを使う。
10.4.round
#=> 10
レシーバー
これはオブジェクト指向で一般的に使われる用語。以下のような場合は左側にあるtweetがレシーバー。 考え方としてはpostがtweetに対して命令を送っているから。
tweet.post
インスタンスメソッドでselfと書くとレシーバーが代入される
例えば下記のように記載した場合、レシーバー自身がselfに代入される形となる。
class mofu
def number
return self*2
end
2.number #=> 4
レシーバー(2)がselfに代入されるイメージ。
Day6まとめ
そろそろTECH EXPERTの基礎部分で学ぶ部分は網羅してきた感があります。あとはこれらの知識を用いてコードを書く練習をすれば結構理解が進むのではないかと思っています。
Day7まではインプット重視で次の週はアウトプット(コードを書く)に重きをおいていければと思います。