Open22

Rails Tutorial time attack!!!

ebiyyebiyy

gem 'capybara', '>= 2.15'
最新バージョンのcapybara gemがインストールされます(これはテストで使うgemです)。極端に言えば、バージョンが7.2であっても、2.15と同じかそれより上のバージョンならインストールされます 。

gem 'rails', '~> 6.0.3'
このように指定すると、rails gemのバージョンが6.0.3と同じかそれより上であり、かつ6.1より小さい場合にインストールされます。つまり、~> 6.0.3という記法ではマイナーバージョンの部分に相当するアップデート済みのgemをインストールします

ebiyyebiyy

Model-View-Controller(MVC)
ブラウザがRailsアプリと通信する際、一般的にWebサーバーにリクエスト(request)を送信し、これはリクエストを処理する役割を担っているRailsのコントローラ(controller)に渡されます。コントローラは、場合によってはすぐにビュー(view)を生成してHTMLをブラウザに送り返します。動的なサイトでは、一般にコントローラは(ユーザーなどの)サイトの要素を表しており、データベースとの通信を担当しているRubyのオブジェクトであるモデル(model) と対話します。モデルを呼び出した後、コントローラは、ビューを描画し、完成したWebページをHTMLとしてブラウザに返します。

ebiyyebiyy

ルーターはコントローラとブラウザの間に配置

ebiyyebiyy

bundle install --without production
gemは本番環境でしか使わないので、このフラグを追加したコマンドを実行してもローカル環境には本番用gemは反映されません。
実行し、Gemfile.lockに反映させないと、本番環境へのデプロイで失敗してしまうためです。

ebiyyebiyy

herokuへのdeployでつまづいたときの解決方法
error message
Failed to install gems via Bundler.

  1. herokuで利用しているbundlerのバージョンと合わせる
  2. プラットフォーム関連のwarningが出てたらそれを実行
  3. リポジトリのサブディレクトリを指定してdeploy
bundler -v
gem uninstall bundler
gem install bundler -v 2.2.16
rm gemfile.lock
bundle _2.2.16_ install
bundle loc --add-platform x86_64-linux
cd ../
git subtree push --prefix <directory_name>/ heroku main

gemfile.lockの変更をpushするのを忘れずにやる

git commit -a -m "Update gemfile.lock for heroku"

参考

ebiyyebiyy

一つのリポジトリのサブディレクトリごとに別々のrails appを管理する場合

rm -rf .git

をrails newで作成したディレクトリ内で行う。

ebiyyebiyy

Command
rails

bundle install --without production
rails generate controller StaticPages home help
rails destroy  controller StaticPages home help
rails generate model User name:string email:string
rails destroy model User
rails db:migrate
rails db:rollback
rails db:migrate VERSION=0
rails console

heroku

heroku create
heroku logs         # 直近のイベントを表示する
heroku logs --tail  # イベント発生のたびに自動表示する(Ctrl-Cで終了)

git

git checkout -b <branch_nane>
git push -u origin <branch_nane>
git checkout main
git merge <branch_nane>

guard

bundle exec guard init
bundle exec guard
bin/spring stop    # テストが原因不明で動かなくなったら、このコマンドを実行してみる
bundle exec guard
ebiyyebiyy

rails testでエラー解決

rails test実行後、capybaraでエラー

/Users/<user_name>/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/capybara-3.28.0/lib/capybara/selector/filters/node_filter.rb:9:in `initialize': wrong number of arguments (given 4, expected 3) (ArgumentError)
...

下記を参考にgemのアップデート、バージョン指定を一旦消した
https://teratail.com/questions/318999

別のエラー

/Users/<user_name>/.rbenv/versions/3.0.1/lib/ruby/gems/3.0.0/gems/bootsnap-1.7.5/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:34:in `require': cannot load such file -- rexml/document (LoadError)

ここを参考に rexml を追加
https://stackoverflow.com/questions/65479863/rails-6-1-ruby-3-0-0-tests-error-as-they-cannot-load-rexml

ruby 3系から必要なgemっぽい.
これで動いた

ebiyyebiyy

4章 js と違うところ

a = [42, 8, 17]
puts a[-1]
#print 17
a.sort #[8, 17, 42]
a #[42, 8, 17]
a.sort! #[8, 17, 42]
a #[8, 17, 42]

a.push(6)
a << 6 #a.push(6)と同じ
a << 6 << 6  #a.push(6)を2回行う

###

x = "foo"
y = ""
puts "Both strings are empty" if x.empty? && y.empty?
#print "One of the strings is empty"
#Rubyでは、メソッドがtrueまたはfalseという論理値(boolean)を返すことを、末尾の疑問符で示す慣習があります。

###範囲

>> a = %w[foo bar baz quux]         # %wを使って文字列の配列に変換
=> ["foo", "bar", "baz", "quux"]
>> a[0..2]
=> ["foo", "bar", "baz"]
>> a[2..-1]                         # 添字に-1を使って選択
=> ["foo", "bar", "baz", "quux"]
>> ('a'..'e').to_a
=> ["a", "b", "c", "d", "e"]
(1..5).each { |i| puts 2 * i }
↕︎
(1..5).each do |i|
 puts 2 * i
end

↕︎

[...Array(5).keys()].map(v=>v+1).forEach(i=>console.log(i*2))
// mapとforEachはいっぺんにまとめられるがあえて

result

2
4
6
8
10
ebiyyebiyy
>> 3.times { puts "Betelgeuse!" }   # 3.timesではブロックに変数を使っていない
"Betelgeuse!"
"Betelgeuse!"
"Betelgeuse!"
=> 3
>> (1..5).map { |i| i**2 }          # 「**」記法は冪乗 (べき乗)
=> [1, 4, 9, 16, 25]
>> %w[a b c]                        # %w で文字列の配列を作成
=> ["a", "b", "c"]
>> %w[a b c].map { |char| char.upcase }
=> ["A", "B", "C"]
>> %w[A B C].map { |char| char.downcase }
=> ["a", "b", "c"]
>> %w[A B C].map(&:downcase)
=> ["a", "b", "c"]
ebiyyebiyy
>> user = { "first_name" => "Michael", "last_name" => "Hartl" }
=> {"last_name"=>"Hartl", "first_name"=>"Michael"}
# ↓のようにシンボルを使うのが一般的
```ruby
>> user = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> user[:name]              # :name に対応する値にアクセスする
=> "Michael Hartl"
>> user[:password]          # 未定義のキーに対応する値にアクセスする
=> nil
>> h1 = { :name => "Michael Hartl", :email => "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> h2 = { name: "Michael Hartl", email: "michael@example.com" }
=> {:name=>"Michael Hartl", :email=>"michael@example.com"}
>> h1 == h2
=> true
ebiyyebiyy
>> puts (1..5).to_a            # 配列を文字列として出力
1
2
3
4
5
>> puts (1..5).to_a.inspect    # 配列のリテラルを出力
[1, 2, 3, 4, 5]
>> puts :name, :name.inspect
name
:name
>> puts "It worked!", "It worked!".inspect
It worked!
"It worked!"
>> p :name             # 'puts :name.inspect' と同じ
:name
ebiyyebiyy
<%= stylesheet_link_tag 'application', media: 'all',
                                       'data-turbolinks-track': 'reload' %>
# メソッド呼び出しの丸カッコは省略可能。
<%= stylesheet_link_tag('application', media: 'all',
                                   'data-turbolinks-track': 'reload') %>
# 最後の引数がハッシュの場合、波カッコは省略可能。
<%= stylesheet_link_tag 'application', { media: 'all',
                                     'data-turbolinks-track': 'reload' } %>

result

<link rel="stylesheet" media="all" href="/assets/application.self-
f0d704deea029cf000697e2c0181ec173a1b474645466ed843eb5ee7bb215794.css?body=1"
data-turbolinks-track="reload" />
ebiyyebiyy

4章終わり 2h
rubyの記法満載だった。
この章は覚えるというよりかはチートシート的に使ったほうが良さそう