『Ruby on Rails チュートリアル』「第10章ユーザーの更新・表示・削除」1

railstutorial.jp

序文

Railsチュートリアル20日目。

今日僕土曜日の気分でいるんですけど日曜日なんですね。

進捗

  • 第10章ユーザーの更新・表示・削除
    • 10.1 ユーザーを更新する

コード実装部分(一部)

/sample_app/app/views/users/edit.html.erb

<%# 順番が気持ち悪いが:titleに"Edit user"を指定し、layouts/application.html.erb内で使用している %>
<% provide(:title, "Edit user") %>
<%# 順番が気持ち悪いが:button_textに"Save Changes"を指定し、 %>
<%# users/_form.html.erb内で使用している %>
<% provide(:button_text, "Save changes") %>
<%# user_pathにPATCHリクエストでユーザーデータを更新する %>
<% provide(:output_path, user_path) %>
<h1>Update your profile</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%# /users/1に対してpostで送信するフォーム %>
    <%# <form class="edit_user" id="edit_user_1" action="/users/1" accept-charset="UTF-8" method="post"> %>
    <%# <input name="utf8" type="hidden" value="&#x2713;" /> %>
    <%# PATCHリクエストを「偽造」している(なくてもいい?) %>
    <%# 実際には@userが既存のものであれば(new_record?メソッドで判定) %>
    <%# PATCHアクションと判断している %>
    <%# <input type="hidden" name="_method" value="patch" /> %>
    <%# <input type="hidden" name="authenticity_token" value="XXXXXXXXXX==" /> %>

    <%# /sample_app/app/views/users/_form.html.erbに定義したレイアウトフォーム %>
    <%= render 'form' %>

    <div class="gravatar_edit">
      <%# ヘルパーメソッドでgravatarへのリンクを作成する %>
      <%= gravatar_for @user %>
      <a href="http://gravatar.com/emails" target="_blank" relationship="noopener">change</a>
    </div>
  </div>
</div>

GitHub

github.com

実行結果

f:id:yjkym:20181209154038p:plain

感想

今日からRailsチュートリアル9章突入。

なお、サンプルアプリケーションの基本的なログイン機構は第8章で実装できているので、実は本章をスキップして第10章に進んでしまうことも可能です

今日からRailsチュートリアル10章突入。

まずはユーザーデータの更新から実装していく。

今までいくつかなんとなくWebアプリケーションを作成してきたが、データの更新ということをやったことがないので、よくわからない。
PATCHアクションとかいうのを使うらしい。

やっぱりRubyはわかりづらい。
目印がないのでその文字列が、変数なのかメソッドなのか、はたまた名前付きルートとかいうやつなのかさっぱりわからなくなる。
「すべてがオブジェクト」らしいので、そういう風に考えること自体が間違いなのだろうとは思うが、まだRubyの思想が腹落ちしていない。

ヘルパーメソッドにしてもどこで定義しているものか分からなくなって、ソースを追うのが難しい。
ひとつひとつコメントを打ってなるべく混乱しないように努めているが…。
チェリー本読めばいいのかなー。

カロリーメイトもください。

今日のunityroom

PuzzCubic | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
www.youtube.com
教本の教材に良さそう

『Ruby on Rails チュートリアル』「第8章 基本的なログイン機構」2

railstutorial.jp

序文

Railsチュートリアル20日目。

Railsチュートリアルは難しいと聞いていたので、今まで習得したRailsの知識にさらに新しい知識をプラスしてくれるものだと思っていたのですが、そもそもRailsが難しいって話だったということに薄々気づいてきましたこんにちは。

進捗

  • 第8章 基本的なログイン機構
    • 8.2 ログイン
    • 8.3 ログアウト
    • 8.4 最後に

コード実装部分(一部)

/sample_app/test/integration/users_login_test.rb

require 'test_helper'

class UsersLoginTest < ActionDispatch::IntegrationTest
  # テストの前に実行する
  # @userにfixturesで生成したユーザーデータを設定する
  def setup
    @user = users(:michael)
  end

(中略)  
  
  # 正しい情報でログインしてログアウトまでできるかのテスト
  test "login with valid information followed by logout" do
    # /loginにGETでアクセスする
    get login_path
    # /loginにPOSTで正しいログイン情報を送信する
    post login_path, params: { session: { email:    @user.email,
                                          password: 'password' } }
    # リダイレクト先が@userであるか
    assert_redirected_to @user
    # 実際にリダイレクトする
    follow_redirect!
    # usersコントローラーのshowレイアウトが適用されているか
    assert_template 'users/show'
    # ログインへのリンクがなくなっているか
    assert_select "a[href=?]", login_path, count: 0
    # ログアウトのリンクがあるか
    assert_select "a[href=?]", logout_path
    # ユーザー情報(@user)へのリンクがあるか
    assert_select "a[href=?]", user_path(@user)
    # /loginにDELETEでアクセスする(内部的にはPOSTらしい)
    delete logout_path
    # ログアウトされたか
    assert_not is_logged_in?
    # ログアウト後のリダイレクト先はroot_urlか(root_pathでもおk?)
    assert_redirected_to root_url
    # リダイレクト処理
    follow_redirect!
    # ログインリンクがあるか
    assert_select "a[href=?]", login_path
    # ログアウトリンクがなくなったか
    assert_select "a[href=?]", logout_path,      count: 0
    # ユーザー情報へのリンクがなくなったか
    assert_select "a[href=?]", user_path(@user), count: 0
  end
end

GitHub

github.com

実行結果

f:id:yjkym:20181208154122p:plain

感想

Railsチュートリアル8章終了。
できれば今年中にRailsチュートリアルを終わらせたいので、比較的スムーズに終わらせられたのは非常に良かった。

ログインとログアウト機能の実装完了。
私がプログラミングの学習方法としてひっそり提唱している「お手本コードをコピペしていいから、一行ずつコメント書け」という方法はやはり有効だと思う。
つーかこれ以外の方法でのちのち知識を役立てられる気がしない…。

いわゆる「写経」すすめる人って頭の構造が違うような気がするんですよね…。
特に意識しなくてもコード書きながらその意味を考えられる人というか…。

凡人(以下)はきっちりノートをとりながら知識を積み重ねていきましょう…。

カロリーメイトください…。

今日のunityroom

ShadowManSearch | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
www.youtube.com
作り込んでますね。
動画には出てないんですが、床ぎりぎりの場所に着地したときにちょっと耐えるようなアクションが出てきてすごい。

『Ruby on Rails チュートリアル』「第8章 基本的なログイン機構」1

railstutorial.jp

序文

Railsチュートリアル19日目。

あまり体調が良くないのでさらっと進捗だけ。

進捗

  • 第8章 基本的なログイン機構
    • 8.1 セッション
    • 8.2 ログイン

コード実装部分(一部)

/sample_app/app/views/sessions/new.html.erb

<%# 順番が気持ち悪いが:titleに@user.nameを指定し、 %>
<%# layouts/application.html.erb内で使用している %>
<% provide(:title, "Log in") %>
<h1>Log in</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%# ログインフォーム %>
    <%# /loginにpostでデータを送信する %>
    <%# <form action="/login" accept-charset="UTF-8" method="post"> %>
    <%# <input name="utf8" type="hidden" value="&#x2713;" /> %>
    <%# <input type="hidden" name="authenticity_token" value="XXXXXXXXXX==" /> %>
    <%= form_for(:session, url: login_path) do |f| %>

      <%# <label for="session_email">Email</label> %>
      <%= f.label :email %>
      <%# <input class="form-control" type="email" name="session[email]" id="session_email" /> %>
      <%= f.email_field :email, class: 'form-control' %>

      <%# <label for="session_password">Password</label> %>
      <%# <input class="form-control" type="password" name="session[password]" id="session_password" /> %>
      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%# <input type="submit" name="commit" value="Log in" class="btn btn-primary" data-disable-with="Log in" /> %>
      <%= f.submit "Log in", class: "btn btn-primary" %>
    <% end %>

    <p>New user? <%= link_to "Sign up now!", signup_path %></p>
  </div>
</div>

GitHub

github.com

実行結果

f:id:yjkym:20181207153446p:plain

感想

Railsチュートリアル8章に本格突入。

ここでは単純なログイン機構を実装していく。
ログインに成功した時のCookieを確認しろという演習があったので、挑戦してみたがFirefoxでは個別のCookieが確認できなくなっているようで苦労した。

一応、Add-onを入れてみたが、解答が載っていないので正しいのかどうかよくわからない。

カロリーメイトください。

今日のunityroom

スキーするD言語くん | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
www.youtube.com
まさかのD言語くん。青い熊っぽい敵はGopherというらしいです。たまに見るなー。
ゲームオーバーのない優しい世界。
こういう何も考えずにだらーっとできるゲーム割と好きです。

『Ruby on Rails チュートリアル』「第7章 ユーザー登録」4

railstutorial.jp

序文

Railsチュートリアル18日目。

スパムメールに「あなたは大きな変態です 無限のミステリー!」とか褒められました。めでたい。

進捗

  • 第7章 ユーザー登録
    • 7.5 プロのデプロイ
    • 7.6 最後に
  • 第8章 基本的なログイン機構
    • 8.1 セッション

コード実装部分(一部)

/sample_app/config/routes.rb

Rails.application.routes.draw do
  # /にGETでアクセスするとstatic_pagesコントローラーのhomeメソッドを実行し、
  # 対応するViewで描画する
  root 'static_pages#home'

  # それぞれのURLにGETでアクセスすると
  # 対応するコントローラーのメソッドを実行し、
  # 対応するViewで描画する
  # get 'static_pages/home'
  # get 'static_pages/help'
  # get 'static_pages/about'
  # get 'static_pages/contact'

  # それぞれのURLにGETでアクセスすると
  # 指定したコントローラーのメソッドを実行し、
  # 対応するViewで描画する
  # ↓のように指定することで名前付きルート(help_path,help_urlなど)が使用できるようになる
  get  '/help',    to: 'static_pages#help'
  get  '/about',   to: 'static_pages#about'
  get  '/contact', to: 'static_pages#contact'
  
  # ↓の指定でsignup_path,signup_urlなどの名前付きルートが使用できる
  get  '/signup', to: 'users#new'
  # /signupにpostでユーザーデータを送ると
  # usersコントローラーのcreateメソッドが実行される
  post '/signup',  to: 'users#create'
  
  # /loginにGETでアクセスすると
  # sessionコントローラーのnewメソッドが実行される
  get    '/login',   to: 'sessions#new'
  # /loginにPOSTでデータを送信すると
  # sessionsコントローラーのcreateメソッドが実行される
  post   '/login',   to: 'sessions#create'
  # /logoutにDELETEでアクセスすると
  # sessionsコントローラーのdestroyメソッドが実行される
  # (内部的にはPOSTらしい)
  delete '/logout',  to: 'sessions#destroy'
  
  # resourcesで多数の名前付きルートが使えるようになる
  # RESTfulなUsersリソースで必要となるすべてのアクションが利用できるようになる
  # (index,show,new,create,edit,update,destroy)
  resources :users
end

GitHub

github.com

実行結果

特になし

感想

Railsチュートリアル7章から8章に突入。

8章からはセッションなどを利用したログイン機能を実装していく。
個人的には個人制作のWebアプリの99%にログイン機能など必要ないと思っているのであまりやる気にならない。
とはいえ飛ばしてしまってはのちのち面倒なことになりそうなのでスピード重視でこなしていきたい。

純粋にWebアプリ作りたいってより「自分の技術力をアピールしたい勢」のためにログイン機能とか実装させるのかな。
偏見かもしれない。

簡単にHTTPSにも対応させたが、最近のWeb界隈はSEOやらスマホ対応やらHTTPS化やら、どんどん一般人にはハードルが高い方向に変化していっているようで、個人製作者としてはなんとも寂しい。
とか言ったら老害扱いされるだろうか。

カロリーメイトください。

今日のunityroom

Unityちゃんマリオ | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
www.youtube.com
ちゃんとカメラがFCライクにステージに追従しててえらい。(前方にスクロールすると後ろに戻れない)

『Ruby on Rails チュートリアル』「第7章 ユーザー登録」3

railstutorial.jp

序文

Railsチュートリアル17日目。

12月とは思えない温かさですねぇ。
忙しいといえば忙しいんですが、もうちょっとなんかアクティブに動いて今年を締めくくりたいところなんですが。

進捗

  • 第7章 ユーザー登録
    • 7.3 ユーザー登録失敗
    • 7.4 ユーザー登録成功

コード実装部分(一部)

/sample_app/test/integration/users_signup_test.rb

require 'test_helper'

class UsersSignupTest < ActionDispatch::IntegrationTest
  
  test "invalid signup information" do
    # /signupにアクセスする
    # 実際のユーザー操作を模倣している。省略しても一応動く
    get signup_path
    # <form ... action="/signup" ...> というHTMLが存在するか
    assert_select 'form[action="/signup"]'
    
    # ブロック内を実行する前後でUser.countが同値であるかをチェックする
    # (投稿するデータが不正であるため、ユーザー数が増えない)
    assert_no_difference 'User.count' do
      # /usersにpostで不正なデータを送信する 
      post signup_path, params: { user: { name:  "",
                                   email: "user@invalid",
                                   password: "foo",
                                   password_confirmation: "bar" } }
    end
    # users/newに対応するテンプレートが表示されているか
    assert_template 'users/new'
    # <div id="error_explanation">…</div>のようなHTMLが存在するか
    assert_select 'div#error_explanation'
    # <li>{エラーメッセージ}</li>のようなHTMLが存在するか
    assert_select 'li', "Name can't be blank"
    assert_select 'li', 'Email is invalid'
    assert_select 'li', "Password confirmation doesn't match Password"
    assert_select 'li', 'Password is too short (minimum is 6 characters)'
  end
  
  test "valid signup information" do
    # /signupにアクセスする
    get signup_path
    # ブロック内を実行する前後でUser.countが+1違うかをチェックする
    # (投稿するデータが正常であるため、ユーザー数が1増える)
    assert_difference 'User.count', 1 do
      post users_path, params: { user: { name:  "Example User",
                                         email: "user@example.com",
                                         password:              "password",
                                         password_confirmation: "password" } }
    end
    # リダイレクトは明示しないといけないらしい
    follow_redirect!
    # users/show.html.erbのテンプレートが表示されているか
    assert_template 'users/show'
    # flashにメッセージが設定されているか
    assert_not flash.empty?
  end
end

GitHub

github.com

実行結果

f:id:yjkym:20181205153523p:plain

感想

Railsチュートリアル7章3日目。もしくは4日目。

1章を3日で終わらせられれば今年中に終わるなーと皮算用していたのだけど、全然終わらねーじゃねーか。

今日はフォームからユーザーデータを実際に登録してみる部分の実装&テスト。

小さい機能を1つ実装するごとにテストのコードを書いて、また新しい機能を実装して…
ってやるの正しいんだろうけど本当にめんどくさいね。

勉強を進めるほどにRailsって覚えることいっぱいあって難しいなーって思っている。
チュートリアルでやってうのはあくまで基本的な部分で、実践力はまた別につけなきゃいけないだろうしなー。

カロリーメイトください。

今日のunityroom

避けまくれ! | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
www.youtube.com
シンプルですがゲームデザインが良いですね。

【新コーナー】『Ruby on Rails チュートリアル』「第7章 ユーザー登録」2

railstutorial.jp

序文

Railsチュートリアル16日目。

新コーナーが始まります。

進捗

  • 第7章 ユーザー登録
    • 7.3 ユーザー登録失敗

コード実装部分(一部)

/sample_app/app/controllers/users_controller.rb

class UsersController < ApplicationController
  def show
    @user = User.find(params[:id])
  end
  
  def new
    @user = User.new
  end
  
  # /usersにPOSTでアクセスしたとき(/signupのフォームからデータを送信したとき)に実行される
  def create
    # /signupから以下のようなハッシュデータが送信されてくる
    # {"utf8"=>"✓",
    #  "authenticity_token"=>"XXXXXXXXXX==",
    #  "user"=>{"name"=>"yjkym", 
    #  "email"=>"y@jk.ym", 
    #  "password"=>"[FILTERED]", 
    #  "password_confirmation"=>"[FILTERED]"},
    #  "commit"=>"Create my account"}
    
    # params[:user]でハッシュデータが取り出せる
    # @user = User.new(params[:user])    # 実装は終わっていないことに注意!
    
    # セキュリティ上、送信データの検証をしてやるべき
    # Strong Parametersというテクニックを使う
    @user = User.new(user_params)
    if @user.save
      # 保存の成功をここで扱う。
    else
      render 'new'
    end
  end
  
  private
    def user_params
      # paramsハッシュでは:user属性を必須とし、
      # 名前、メール、パスワード(確認)の属性を許可する
      # 返り値はハッシュ↓
      # {"name"=>"", "email"=>"", 
      #  "password"=>"", "password_confirmation"=>""} 
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end
end

GitHub

github.com

実行結果

f:id:yjkym:20181204153202p:plain

感想

Railsチュートリアル7章2日目。もしくは3日目。

いよいよフォームからデータを投げるようなことをやりはじめて、学習速度がガクッと落ちた。

Strong Parametersとか散々やった記憶あるんだけど、やっぱり全然定着してないな。
まぁ仕方ないねー難しいもん。
例によって逐一コメントを書きながら進めていくが、いろんなファイルが絡み合ってきて処理の順番を追うだけでも一苦労。

今、MVCのどの部分で処理が行われているのかということをしっかり意識しながらやっていこう。
明日からは。

カロリーメイトください。

今日のunityroom

(2曲)音ゲー譜面自動生成(音ゲー素案) | 無料ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
www.youtube.com
音ゲー少ないのでいいですね。
ランキングつけてunity1週間ゲームジャムにあわせて出せば凄腕のお兄さんたちが競ってやってくれそうです。

このコーナーがいつまで続くかは不明。

【満身創痍】『Ruby on Rails チュートリアル』「第7章 ユーザー登録」1

railstutorial.jp

序文

Railsチュートリアル15日目。

土曜日に肩の痛みが再び悪化して動けなくなり病院に運ばれてました…。
結局ロキソニンもらって放り出されただけでした。
今後ブログの更新が止まったら察してください。
冗談ですが。

進捗

  • 第7章 ユーザー登録
    • 7.1 ユーザーを表示する
    • 7.2 ユーザー登録フォーム

コード実装部分(一部)

/sample_app/app/views/users/new.html.erb

<%# 順番が気持ち悪いが:titleに@user.nameを指定し、layouts/application.html.erb内で使用している %>
<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>
<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%# /usersに対してpostで送信するフォーム %>
    <%# <form class="new_user" id="new_user" action="/users" accept-charset="UTF-8" method="post">
    <%# <input name="utf8" type="hidden" value="✓"><input type="hidden" name="authenticity_token" value="qxxxxxxxxxx">  %>
    <%# @userはコントローラーnewされているので新規入力フォームが生成される %>
    <%= form_for(@user) do |f| %>
      <%# <label for="user_name">Name</label> %>
      <%# f.labelなどはメソッドを呼び出している %>
      <%= f.label :name %>
      <%# <input type="text" name="user[name]" id="user_name"> %>
      <%= f.text_field :name %>
      <%# <label for="user_email">Email</label> %>
      <%= f.label :email %>
      <%# <input type="email" name="user[email]" id="user_email"> %>
      <%= f.email_field :email %>
      <%# <label for="user_password">Password</label> %>
      <%= f.label :password %>
      <%# <input type="password" name="user[password]" id="user_password"> %>
      <%= f.password_field :password %>
      <%# <label for="user_password_confirmation">Confirmation</label> %>
      <%= f.label :password_confirmation, "Confirmation" %>
      <%# <input type="password" name="user[password_confirmation]" id="user_password_confirmation"> %>
      <%= f.password_field :password_confirmation %>
      <%# <input type="submit" name="commit" value="Create my account" class="btn btn-primary" data-disable-with="Create my account"> %>
      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>

GitHub

github.com

実行結果

f:id:yjkym:20181203152845p:plain

感想

Railsチュートリアル7章本格突入。

Railsの仕様が複雑なことと、チュートリアルの難易度自体があがっていることと、あいかわらず体調がいまいちなことが相まって、いまいち身についている感がない。

今までは一応2日で1章ページですすんできたのだが、だんだん内容が複雑になってきて今までのペースで進めるのは難しそうだ。

一応、3日で1章ページですすめれば今年中に終えられるのでそれを目標にしよう。

というか最近ここの欄、内容のことについてほとんど触れてない気がするね。
集中集中。

カロリーメイトください。

BGM

健康 / KREVA www.youtube.com