キリンめも

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

Railsの会26日目[ /authenticate/minimum / !!]

今回の範囲
f:id:geta206:20170624095221p:plain

パスワード設定

6文字分のスペースでパスワードを設定した場合falseで返すテスト

  test "password should be present (nonblank)" do
    @user.password = @user.password_confirmation = " " * 6
    assert_not @user.valid?
  end

最低5文字以内か調べる

  test "password should have a minimum length" do
    @user.password = @user.password_confirmation = "a" * 5
    assert_not @user.valid?
  end

minimum

カラムの最小値を求める。

User.minimum('age')
# SELECT MIN("users"."age") AS min_id FROM "users"

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

!!

論理オブジェクトに変換。
trueかfalseで返すようにする。

!!user.authenticate("foobar")
=> true

authenticate

認証に失敗した時にfalseを返す。
( !!がついている場合結果が反対になる)

間違えているpasswordを与えてみる

[14] pry(main)> user.authenticate("not_the_right_password")
=> false

正しい値を与えてみる

[15] pry(main)> user.authenticate("password")
=> #<User:0x007fcb694285b0
 id: 1,
 name: "hoge",
 email: "h@h.com",
 created_at: Tue, 20 Jun 2017 16:09:49 UTC +00:00,
 updated_at: Tue, 20 Jun 2017 16:09:49 UTC +00:00,
 password_digest: "$2a$10$Hl8/iF2bbu7D37z3aeh5T.OMNdhRR0flsFhflsfF3L/E041sO">

Rubyの否定演算子2つ重ね「!!」(double-bang)でtrue/falseを返す

6 章のまとめ

マイグレーションを使うことで、アプリケーションのデータモデルを修正することができる
・Active Recordを使うと、データモデルを作成したり操作したりするための多数のメソッドが使えるようになる
・Active Recordのバリデーションを使うと、モデルに対して制限を追加することができる
・よくあるバリデーションには、存在性・長さ・フォーマットなどがある
正規表現は謎めいて見えるが非常に強力である
・データベースにインデックスを追加することで検索効率が向上する。また、データベースレベルでの一意性を保証するためにも使われる。
・has_secure_passwordメソッドを使うことで、モデルに対してセキュアなパスワードを追加することができる

bash で branch名が表示できるようにした。

以前は oh my zshを使用していたが、古いとか重いなど記事があり
今回bashで導入したのでメモ。

Mac OS X で zsh + oh-my-zsh の環境を作って一通り設定するまで - Qiita
qiita.com

導入後
f:id:geta206:20170623140347p:plain

導入手順

1 .bash_profile

.bash_profile に記載すする。その後再起動します。

source /usr/local/etc/bash_completion.d/git-prompt.sh
source /usr/local/etc/bash_completion.d/git-completion.bash
GIT_PS1_SHOWDIRTYSTATE=true
export PS1='\[\033[32m\]\u@\h\[\033[00m\]:\[\033[34m\]\w\[\033[31m\]$(__git_ps1)\[\033[00m\]\$ '

Railsの会25日目[dup /インデックス/pg (0.18.4) ]

今回の範囲(続き)
f:id:geta206:20170613165707p:plain

インデックス

データベースの世界で、インデックス(索引)とはテーブルに格納されているデータを高速に取り出す為の仕組みです。
基本: カラムに対してインデックスをつける。

ALTER TABLE landing_pages ADD INDEX index_name(user_id)

インデックスが早い時

1. テーブル内のデータ量が多く、少量のレコードを検索する場合
2. WHERE句の条件、結合の条件、ORDER BY句の条件として頻繁に利用する
ただし全表走査が目的のテーブルであれば索引は不要
3. NULL値が多いデータから、NULL値以外の検索をする

IndexはNULLを含まないのでNULL値以外の検索には効果がある

indexを導入しない方がいい時

1.表の規模が小さいか、表から大部分のレコードを検索する場合
2.WHERE句等の条件としてあまり仕様されないもの
3.列の値が頻繁に挿入、更新、削除される
4.Indexは表に新規行が挿入されればIndexにも自動的に値が格納される。そのためデータの検索速度は向上するが挿入、更新、削除の処理では索引のメンテナ
ンス作業が発生し、速度低下につながる
5.WHERE句の条件として使用されるが、列が式の一部として参照される
MySQLのIndexをはるコツ - Qiita

validation

1. validatesを使い、モデルクラスに検証する条件を定義する。

# 商品名は必須
validates :title, presence: true

2. コントローラーなどでモデルを保存/更新する。

if @product.save
redirect_to @product, notice: '商品を作成しました'
else
render :new
end

3. バリデーションエラー時には、errorsにエラーメッセージが設定されるので、それを表示する

Rails 4でモデルのバリデーションまとめ - Rails Webook

一意性 (ユニーク制約)のチェック

指定した属性がユニーク(一意:意味や値が一つに確定していること。)検証する。

Rails 4でモデルのバリデーションまとめ - Rails Webook

dup

元のオブジェクトと同じクラスの新しいオブジェクトで、
元のオブジェクトのインスタンス変数を新しいオブジェクトにコピーしたもの。

h = Hoge.new
hd = h.dup

h.name = 'name'
hd.name = 'dup'
h.name #=> 'name'

clone, dup (Object) - Rubyリファレンス

uniqueness

指定した属性がユニークであることを検証する。

# 定義
validates email, uniqueness: true # 値がユニークであれば検証成功

# テスト
it { is_expected.to validate_uniqueness_of(:email) }

Rails 4でモデルのバリデーションまとめ - Rails Webook

upcase / downcase

self.email = email.downcase

before_save

セーブする直前に毎度呼び出される。

before_save{ self.email = email.downcase }

コールバック

バリデーションの実行、DBの保存などのタイミングで処理を行うための機能。

一部例

  1. after_validation #検索メソッドでオブジェクトが見つかったタイミングで実行
  2. before_save #オブジェクトがインスタンス化されたタイミングで実行

» Railsのコールバックまとめ TECHSCORE BLOG

Bundler cannot continue.のエラーが出た時

An error occurred while installing pg (0.18.4), and Bundler cannot
continue.
Make sure that `gem install pg -v '0.18.4'` succeeds before bundling.

解決策

その1

brew install postgressql
bundle update

その2
$ bundle install --without production

Bash on WindowsでRailsの環境構築してはまったところ。

以下のサイトを参考にして構築しました。
windowsのbashでRails環境を構築してみる。(Windows 10 Anniversary Update版) - Qiita


デフォルトの状態でgit >rbenv >rubyの順番で試したが、うまくいかず私の場合作業用フォルダを作成してその中でgit >rbenv> rubyの順番で導入しました。



Bundle install できない問題

原因  ローカルではなくグローバルのrubyを使っているから
最新のrubyをダウンロードしたはず、、

$ ruby -v
ruby 2.0.0p481 (2014-05-08 revision 45883) [x86_64-linux]
$ rbenv exec gem install bundler
   Fetching: bundler-1.10.3.gem (100%)
   Successfully installed bundler-1.10.3
   Parsing documentation for bundler-1.10.3
   Installing ri documentation for bundler-1.10.3
   1 gem installed
$ rbenv rehash # 忘れずに!
$ which bundle
   ~/.rbenv/shims/bundle

$ bundle install --path vendor/bundle
Fetching gem metadata from https://rubygems.org/........
Fetching version metadata from https://rubygems.org/..
Using rake 10.3.2
...(中略)...
Using bundler 1.10.3
Bundle complete! 15 Gemfile dependencies, 45 gems now installed.
Bundled gems are installed into ./vendor/bundle.

bundle install しようとしたら ruby のバージョン違くてコケた話 - Qiita

DBがないと言われる

$bin/rails db:migrate

下のようにでたらおk

== 20170515162447 CreateUsers: migrating ======================================
create_table(:users)
== 20170515162447 CreateUsers: migrated (0.0019s) =============================

Railsの起動にはまる

rails aborted!
Errno::EINVAL: Invalid argument - Failed to watch "/home/nishioka/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activesupport-5.0.0/lib/active_support/locale": the given event mask contains no legal events; or fd is not an inotify file descriptor.
/home/nishioka/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.7/lib/rb-inotify/watcher.rb:74:in `initialize'
/home/nishioka/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rb-inotify-0.9.7/lib/rb-inotify/notifier.rb:190:in `new'

以下を記入

config/environments/development.rb
#config.file_watcher = ActiveSupport::EventedFileUpdateChecker
 以下を追加
  config.file_watcher = ActiveSupport::FileUpdateChecker

Rails serverが失敗する

Gem fileの以下のコメントをはずす
gem 'therubyracer', platforms: :ruby

再度bundle installをしてrails s をする

Bash on WindowsでRails開発 - Qiita

Railsの会 24日目 「%w[]/assert/正規表現/」

今回の進捗です
f:id:geta206:20170526143856p:plain

%w[]

配列を作る。 スペースと区切りで指定する。

>> %w[foo bar baz]
=> ["foo", "bar", "baz"]
>> addresses = %w[USER@foo.COM THE_US-ER@foo.bar.org first.last@foo.jp]
=> ["USER@foo.COM", "THE_US-ER@foo.bar.org", "first.last@foo.jp"]
>> addresses.each do |address|
?>   puts address
>> end
USER@foo.COM
THE_US-ER@foo.bar.org
first.last@foo.jp

Rubyで%記法(パーセント記法)を使う - Qiita

.inspect

オブジェクトをわかりやすい文字列に返す。

message = "hello, world"
puts message.inspect
number = 123
puts number.inspect
 
class Cat
  def initialize(name, color)
    @name = name; @color = color
  end
end
 
cat = Cat.new("Tama", "white")
puts cat.inspect

結果

   "hello, world"
123
#<Cat:0x1a80500 @name="Tama", @color="white">

用途

変数や配列など文字列になる可能性のあるものを調べるときに使う。
inspect (Object) - Rubyリファレンス

assert

処理ができていれば trueを表示 それ以外はメッセージを表示

   class AssertTest < ActionController::IntegrationTest
  def test_assert
    assert false, "falseは想定外です"
    assert nil, "何らかの値が設定されるべきです"
  end
end

正規表現

いくつかの文字列を一つ文字列で表す方法。
曖昧検索が可能になる!

メタ文字

通常の文字a,b,c...etc と組み合わせて使います。
例 \d \D \w \W \s \S
正規表現 - Wikipedia

^t.*?[ao]{2,4}.*?@(gmail\.com|yahoo\.co\.jp)

解説

^t → 先頭に t がある。
.*?  → 文字がいくつかあるかもしれないし、ないかもしれない。
[ao]{2,4} → a か o が2文字~4文字ある。
@ → @がある。
(gmail¥.com|yahoo¥.co¥.jp) 
gmail.com か yahoo.co.jp のどちらかがある。

正規表現入門その1 基本解説:ビギナー入門用