体重133キロからのプログラミング

体重はちょっと減って今125キロです。

人生49日目

Railsチュートリアル(13)2週目

今日は午前中ずっと家具の組み立てを指定て数時間じか勉強できなかった。
明日は頑張ろう。

初学者同士で繋がりたいけど、初学者同士で繋がりたいとかハッシュタグつけてるような感じの人とはあんまり繋がりたくない。わかる?この気持ち

人生48日目

Railsチュートリアル(12)2週目

走破した。この辺から本当に複雑になってくるなーという印象。
モヤっとしたところがあってSlackで質問しようと思い、

Railsのルートについての質問です。 Railsチュートリアルの中のことなんですが、routes.rbにresources :usersとすると、名前つきルートが使えるようになりますよね。 この場合、editアクションに対応するURLは「/users/1/edit」で「1」の部分はマジックカラムであるid が入っていて、params[:id]のようにして取り出せる。 ここまではわかるのですが(わかってなかったら申し訳ないです)、resources :account_activations, only: [:edit]とした時のeditアクションのURLが「/users/token/edit」になると記載されていて、実際そうなっています。 この時の名前付きルートは「edit_account_activation_url(token)」と記載されているんですが、

まで打って、質問する前に気づいた。
つまりこれが”WEBアプリケーションの仕組み”そのものだった。

「URLがあって、それに対応するHTMLがある」という仕組みではなく、

「URLに情報を乗せて、アクションを呼び出し、アクションがそれに応じたビューを返す」

っていう仕組みになっている。今更何言ってんだって感じだろうけど。

これに気づいた手順を以下に記す。

雑魚ワイがWEBの仕組みに気づくまで

1.「prams[:id]」ってidって書いてあるけど単純にマジックカラムのidを指してるわけじゃねーよな・・・。
だってこれでactivation_token取り出せたもんな。そもそもactivation_tokenってattr_accessorで指定した仮想の属性なのになんで取り出せたんだ?
実際に属性が存在するならまだわからんでもないけど・・・。

2.「edit_user_path」だと「users/1/edit」ってことは、「edit_activation_path」って「/activations/1/edit」のはず。URL叩いてみよう。
→root_urlにリダイレクトされ、エラーメッセージが表示される。

3.例外じゃなくてルートURLに飛ばされてエラーメッセージまで出てる。つまり正常に動いてこういう判断をしたっていうことか。
エラーメッセージは「Invalid activation link」、これを設定してるコードを探そう。

4.コードを検索する

#app/controllers/account_activations_controller.rb
class AccountActivationsController < ApplicationController

  def edit
    user = User.find_by(email: params[:email])
    if user && !user.activated? && user.authenticated?(:activation, params[:id])
      user.activate
      log_in user
      flash[:success] = "Account activated!"
      redirect_to user
    else
      flash[:danger] = "Invalid activation link"
      redirect_to root_url
    end
  end
end

見つけた。ここで定義してあるフラッシュメッセージだった。
ん?そういえば名前付きルートには「edit_account_activation_url(token)」とあって、(token)を渡してる形になってた。

5. そういえばmailerのテンプレートでURLを作るコードがあったな・・・

.
.
<%= link_to "Activate", edit_account_activation_url(@user.activation_token,email: @user.email) %>
.
.

はい、ここでわかりました。

「edit_account_activation_url」は単に「このアプリケーションの地図としてのURL」ではなく、「editアクションに情報を渡すためのトロッコのようなもの」だったんですね。
(@user.activation_token,email: @user.email)となっているのは「:idに当たる部分にはactivation_tokenを乗せて、ついでにemailも乗せてくれ」という意味。
URLは場所を示しているのではなく、対応するアクションに値を送っているのですね。
対応するアクションに値を送るという意味では地図的なものでもあるのか。脳内の言語化難しすぎる。

先ほど「/activations/1/edit」を直接入力してリダイレクトされたのは、editアクションでparams[:email]を取得した結果、nilだったから、その後の処理でリダイレクトされ、エラーメッセージが表示されたと。
mailerのテンプレートでURLを設定したのは、「URLにトークンとメールアドレスを乗せる」ため。
これによってeditアクションはparams(URL)から[:email]を取り出してユーザーを探して次の処理にいけるっていうこと。

こんなことも分からずに、Railsを学んでいたのが本当に恥ずかしい。
みんなは基本情報の勉強、ちゃんとしような!

人生47日目

Railsチュートリアル(12)2週目

パスワード再設定機能を実装する章。
ほとんどが前章と同じなのでサクサク進む。今日は半分ほどで一旦切り上げ。

くら寿司の採用ページ

無限 無添 くら寿司| 採用サイト みなさんこれ見ましたか?
僕こういうの作りたすぎて震える。
こういう意味わかんなさに本気になってるの好き。
トップページもさることながら、個別のページもアニメーションがたくさんあってかっこいい。好き。

最近の関東地方

曇りと通り雨多すぎて洗濯できねえ!!
ということで今日は4日分の洗濯物を抱えてランドリーに行った。
さすがベッドタウンのランドリー。かなり綺麗なところだった。
しかし1回で乾かないことがわかりきっているのに終わるたびに100円投入してまた回すのって結構めんどくさいよね。
そういうアプリケーション作りたくねえなって思いました。

人生46日目

Railsチュートリアル(11)2週目

今日は家具を買いに出かけていたのでほとんど勉強できなかった。
昨日「統合テスト自分で書くとかヤベーよ何時間かかるんだ」と思って逃げていたけど、今朝改めて見てみたら簡単だった。
一応コードを乗せておく。(GREENだから合ってると思う)

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

ここまでの演習課題で変更したコードをテストするために、/users と /users/:id の両方に対する統合テストを作成してみましょう。 「ここまでの演習課題で変更したコード」をテストすればよい。

今回は「usersページにactivateされていないユーザーを表示しない」こと、「activateされていないユーザーの個別のページへアクセスした場合、root_urlにリダイレクトされる」以上2つのテストを書けばいいだけだった。

class UsersIndexTest < ActionDispatch::IntegrationTest
  def setup
    @admin     = users(:michael)
    @non_admin = users(:archer)
  end
.
.
  test "index shows only activated users" do
    #activatedがtrueならどのユーザーでもいい
    log_in_as(@admin)
    get users_path
    #usersコントローラーのindexアクション内にある@usersを指定
    assigns(:users)
    #@usersが全員activateされているかどうかを確認                
    assert users.map(&:activated?)  
  end
.
.
end

mapで全員にactivated?を渡しているとユーザー数が多い時とんでもないことになりそう。
今回はテストなのでべつにいいのかな?とは思った。

users/:idページについては本編で一度もテストを書いていないので、まずはrailsコマンドで生成する必要がある。

$ rails g integration_test users_show
require 'test_helper'

class UsersShowTest < ActionDispatch::IntegrationTest
  def setup
    @user     = users(:michael)
    @other_user = users(:archer)
    #activatedがfalse(nil)のユーザーを設定
    #他でも使うかもしれないのでtest_helperにメソッドを作成している
    @no_activated_user = no_activated_user
  end

  test "should show only activated user" do
    log_in_as(@user)
    get user_path(@other_user)
    assert @other_user.activated?
  end

  test "should redirect to root_url if user is not activated" do
    log_in_as(@user)
    get user_path(@no_activated_user)
    assert_redirected_to root_url
  end
end

これに関しては読んだままだし特にコメント書くことなかった。
test_helperは以下のようにメソッドを定義してみた。

.
.
.
class ActionDispatch::IntegrationTest
.
.
.
  #log_in_asメソッドではemailとpasswordしか使わない
  #僕のメンターが烏龍茶で頭を洗ったら翌日の寝癖がゲリョスだったため
  def no_activated_user
    User.create(name:"Maehara Geryosu",
                email:"otya_de_atama_arau@example.com",
                password: "password",)
  end
end

やってみて「命名の難しさ」をビシバシと感じた。
テストの名前もひどいし変数名も、メソッド名もひどい・・・本当に難しい。
命名で悩んでコード書かないと本末転倒なのでとりあえず命名してみた感じ。
ということで、リーダブルコードを読みたい欲が高まった。
あと、本当にこれで合っているのか心配なのでもしも根気強く読んでくれた方がいればご意見いただけるとありがたいです。

Qiitaのように、コードにファイル名を付けられないようだったので以下の記事を参考にさせていただきました。感謝。CSSで実装してくれたようです。
はてなブログでソースコード表示時にタイトルを付ける - 酔いどれ技術者の備忘録

リーダブルコード買った

先ほど申し上げました通り今日は家具を買いに(彼女の金で)出かけていたので、本屋に寄ってリーダブルコードを入手。(彼女にねだって買ってもらった)
まだ半分ほどしか読んでないけど相当面白い。
本当にエンジニアになれたら、この本は何度も読み返すことになりそうだなって思った。
あと本来ここで知るべきではないんだろうけど、JavaとかC++を初めて読んで、「あ、プログラミング言語ってだいたい同じように読めるんだ」と知れたのは大きい。
他の言語に挑むことに尻込みしていたけど、Javaに関してはとっつきやすそうだなと思った。
(どっちが卵でどっちが鶏か、みたいなことはまだ覚えてないのでわからない)

自分が書いたコード晒すのってクソ恥ずかしいな。普段から綺麗に書こう。夏侯惇
早く仕事したい。そんな僕でした。

人生45日目

Railsチュートリアル⑾2週目

⑾ってこんなにほっそりしてるのか…。

主にメイラーの使い方を学んだ。本当に学べてるか?
だんだん難しくなってきて、1日1章がやっとですね。2週目なのに。

「じゃあ、/usersと/user/:idの統合テスト書いてみよっか」とかいう爆発的に時間がかかる演習が突然出てきたのでこれは明日に回すことにした。
知らなかったことをノートに書いて、中のコードは出来るだけ自分で打ってみるスタイルでやってる。(いわゆる写経)

ノートにも書いてるからW写経だ!!!!!

2週目も終わりが見えてきた、早く自分で何か作りたい。
1つ作り終えたら復習をかねて3週目をやりつつ、チュートリアルの解説なんかもできればいいなと思った。
なんでも勉強には「ラーニングピラミッド」っていうのがあるらしく、人に教えるのが一番勉強になるらしい。
人に教える場合、その内容の定着率は9割にも及ぶとか。Railsチュートリアル解説したら実質俺がチュートリアルやん!
チュートリアル山順平って呼んで!!!!!

平均学習定着率が向上する「ラーニングピラミッド」とは? | キャリア教育ラボ

人生44日目

Railsチュートリアル⑽2週目

indexページ実装・ユーザー削除機能実装。
これでRESTの要件を満たしたページができたらしい。
やればやるほど、Railsってすげーんだなってなる。

<% @users.each do |user| %>
  <%= render user %> #パーシャル呼び出し
<% end %>

これを

<%= render @users %>

だけで呼び出せる(sugosugiru)

これの何がやべーって、パーシャルも含めて呼び出せること。
中でどう動いてるのかすごくきになるので、2週目完走後調べてみようと思う。

Heroku死んでた

そういえば今日、チュートリアルの章末でデプロイしようとしたらできなくて、なんでだろうなと思ってTwitterで検索してみたらHerokuさんが落ちてた。
RailsチュートリアルもHerokuアプリみたいで、繋げなくなってしまったので今日はここまで!!(大義名分を得た)

人生43日目

Railsチュートリアル(10)2週目

2/3くらいまでやった。かなり複雑になってきた。
この辺まで来ると最初の方にやったことを覚えてないのでメソッド名にピンとこなかったりするので大変である。
1週したはずなのに初見のような内容が多い。あ、テスト飛ばしたからだ。
今は読めばわかるっていう段階になってるので成長してるのでは、と思う。
早く2週目を終えてポートフォリオ作りたい。
就活にポートフォリオ関係なくね?派と必須派がいるみたいで怖い。
SES反対派と賛成派もいる。
僕はSESからキャリアスタートしようと思ってるしポートフォリオも作ります。
逆張りおじさんが蔓延るおかげ?で「人生は自分で選べ」という本質が浮き彫りになってる気がする。