# 2024-06-15
Table of Contents
2024-06-15
久々に rails new するぞ
devcontainer で rails new してみるのがゴール
ディレクトリを作っていく
$ mkdir Rails$ mkdir rails-playground$ cd $_$ ruby -v$ rbenv local 3.4.0-preview1$ git init$ git st$ git add -A$ gc
v7.2.0.beta2 を使ってみる
❯ bundle initWriting new Gemfile to /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/Gemfile$ vi Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
gem "rails", github: "rails/rails", tag: "v7.2.0.beta2"
$ bundle config set path 'vendor/bundle'$ bundle install# すでにディレクトリは作ってあるので rails new . で良いのかあ# この時点ではまだ bundle exec$ bundle exec rails -h$ bundle exec rails new . -a propshaft -c tailwind -d postgresql
なんか .gitignore とGemfileが衝突しちゃったな。とりあえず Y (overwrite)
pin とか言っている。あとは foreman も入ってくれるのか。便利
rails importmap:install/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec./Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec. apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/importmap-rails-2.0.1/lib/install/install.rb Add Importmap include tags in application layout insert app/views/layouts/application.html.erb Create application.js module as entrypoint create app/javascript/application.js Use vendor/javascript for downloaded pins create vendor/javascript create vendor/javascript/.keep Configure importmap paths in config/importmap.rb create config/importmap.rb Copying binstub create bin/importmap run bundle install --quiet rails turbo:install stimulus:install/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec./Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec. apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/turbo-rails-2.0.5/lib/install/turbo_with_importmap.rb Import Turbo append app/javascript/application.js Pin Turbo append config/importmap.rb run bundle install --quiet/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec. apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/turbo-rails-2.0.5/lib/install/turbo_needs_redis.rb Enable redis in bundle gsub Gemfile run bundle install --quiet Switch development cable to use redis gsub config/cable.yml run bundle install --quiet/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec. apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/stimulus-rails-1.3.3/lib/install/stimulus_with_importmap.rb Create controllers directory create app/javascript/controllers create app/javascript/controllers/index.js create app/javascript/controllers/application.js create app/javascript/controllers/hello_controller.js Import Stimulus controllers append app/javascript/application.js Pin Stimulus Appending: pin "@hotwired/stimulus", to: "stimulus.min.js" append config/importmap.rb Appending: pin "@hotwired/stimulus-loading", to: "stimulus-loading.js" append config/importmap.rb Pin all controllers Appending: pin_all_from "app/javascript/controllers", under: "controllers" append config/importmap.rb run bundle install --quiet rails tailwindcss:install/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec./Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec. apply /Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/tailwindcss-rails-2.6.1-x86_64-darwin/lib/install/tailwindcss.rb Add Tailwindcss include tags and container element in application layout insert app/views/layouts/application.html.erb insert app/views/layouts/application.html.erb insert app/views/layouts/application.html.erb Build into app/assets/builds create app/assets/builds create app/assets/builds/.keep append .gitignore Add default config/tailwindcss.config.js create config/tailwind.config.js Add default app/assets/stylesheets/application.tailwind.css create app/assets/stylesheets/application.tailwind.css Add default Procfile.dev create Procfile.dev Ensure foreman is installed run gem install foreman from "."Fetching foreman-0.88.1.gemSuccessfully installed foreman-0.88.11 gem installed Add bin/dev to start foreman create bin/dev Compile initial Tailwind build run rails tailwindcss:build from "."/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
.devcontainer/Dockerfile はこんな感じ
# Make sure RUBY_VERSION matches the Ruby version in .ruby-versionARG RUBY_VERSION=3.4.0.preview1FROM ghcr.io/rails/devcontainer/images/ruby:$RUBY_VERSION
❯ bin/rails -hUsage: bin/rails COMMAND [options]
You must specify a command. The most common commands are:
generate Generate new code (short-cut alias: "g") console Start the Rails console (short-cut alias: "c") server Start the Rails server (short-cut alias: "s") test Run tests except system tests (short-cut alias: "t") test:system Run system tests dbconsole Start a console for the database specified in config/database.yml (short-cut alias: "db") plugin new Create a new Rails railtie or engine
All commands can be run with -h (or --help) for more information.
In addition to those commands, there are:
/Users/noriyo_tcp/MyPlayground/til/Rails/rails-playground/vendor/bundle/ruby/3.4.0+0/gems/bootsnap-1.18.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30: warning: /Users/noriyo_tcp/.rbenv/versions/3.4.0-preview1/lib/ruby/3.4.0+0/ostruct.rb was loaded from the standard library, but will no longer be part of the default gems since Ruby 3.5.0. Add ostruct to your Gemfile or gemspec.
ostruct が 3.5.0 でデフォルトではなくなるので Gemfile に追加するようにとの警告が出ている。とりあえず Gemfile に追加してインストール
devcontainer で Docker のパスが見つからない
https://github.com/microsoft/vscode-remote-release/issues/9105
VS Code settings Dev > Containers: Docker Path でパスを指定しておく
# これで表示されるパスを指定しておく ❯ which docker /Users/noriyo_tcp/.docker/bin/docker
ruby 3.4.0-preview1 を使っていたせいで devcontainer がこけてしまった
3.3.3 をインストールする
❯ rbenv install 3.3.3 ❯ bundle install --redownloadFetching gem metadata from https://rubygems.org/.........Your bundle is locked to strscan (3.1.1) from rubygems repository https://rubygems.org/ or installed locally, but that version can no longer befound in that source. That means the author of strscan (3.1.1) has removed it. You'll need to update your bundle to a version other than strscan(3.1.1) that hasn't been removed in order to install.
# Gemfile を削除して bundle install --redownload 再度実行rm Gemfile.lock
.devcontainer/devcontainer.json
にて
なんかコンテナ立ち上げた後の bin/setup はあるが、コンテナ内で bundle install するような記述はない
ということは rails はローカルに入れておくということなのかなやっぱり
もう一度 devcontainer を開こうとするとこんなエラーが
Error response from daemon: No such image: ghcr.io/rails/devcontainer/images/ruby:3.4.0.preview1
image の指定を修正する
.devcontainer/Dockerfile
ここでまだ 3.4.0-preview1 のほうを見ていたので修正した root の Dockerfile も
--- a/.devcontainer/Dockerfile+++ b/.devcontainer/Dockerfile@@ -1,3 +1,3 @@ # Make sure RUBY_VERSION matches the Ruby version in .ruby-version-ARG RUBY_VERSION=3.4.0.preview1+ARG RUBY_VERSION=3.3.3
diff --git a/Dockerfile b/Dockerfileindex d06233a..07b3931 100644--- a/Dockerfile+++ b/Dockerfile@@ -7,7 +7,7 @@ # For a containerized dev environment, see Dev Containers: https://guides.rubyonrails.org/getting_started_with_devcontainer.html
# Make sure RUBY_VERSION matches the Ruby version in .ruby-version-ARG RUBY_VERSION=3.4.0.preview1+ARG RUBY_VERSION=3.3.3 FROM docker.io/library/ruby:$RUBY_VERSION-slim as base
ここまでやって Rebuild and reopen in container
volumes: - type: bind source: /Users/noriyo_tcp/MyPlayground/til/Rails target: /workspaces bind: create_host_path: true
見てると redis, standalone-chromium, postgres などのイメージを構築している
コンテナの中でわざわざまた bundle install しているぞ?
# in containerbin/dev
立ち上がった! localhost:3000 で確認できた
# on Host ❯ docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESeec507746391 rails_playground-rails-app "/bin/sh -c 'echo Co…" 7 minutes ago Up 7 minutes 0.0.0.0:45678->45678/tcp rails_playground-rails-app-15e8a9016951e postgres:16.1 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 5432/tcp rails_playground-postgres-11ef1dd24896a seleniarm/standalone-chromium "/opt/bin/entry_poin…" 7 minutes ago Up 7 minutes 4444/tcp, 5900/tcp rails_playground-selenium-171ee2fc88442 redis:7.2 "docker-entrypoint.s…" 7 minutes ago Up 7 minutes 6379/tcp rails_playground-redis-1
一旦 Docker Desktop でサクッと止めておいた
コンテナの中だけにしたい
見た感じコンテナ内で bundle install しているようだから、ホスト側に入れておく必要はないのでは?
Remote connection とコンテナ止めておく
# on Hostgem list --no-versions | grep "^[a-z]" | xargs gem uninstall -aIxrbenv exec gem list #=> rails はない❯ rails -hrbenv: rails: command not found
The `rails' command exists in these Ruby versions: 2.1.1 2.2.3 2.5.3 2.7.2 2.7.3 3.0.0 3.1.2 3.2.0 # 3.3.3 には rails はない
そしてまた reopen in container する。コンテナ内ではすでに rails やその他 gem を入れてあるのですんなり動く
container で使用する拡張機能を指定する
該当する extension をタブで開いてadd devcontainers.json を押せば良い
Remote 用の設定画面で Solargraph: Use Bundler をオンにしてみた
Rals Guides の Getting Started をやっていくぞ
link_to の第2引数はパスヘルパーを使用しなくても、リソースを渡せば良いのだな?
元々そうだったっけ?
https://api.rubyonrails.org/classes/ActionView/Helpers/UrlHelper.html#method-i-link_to
そうだったっぽい
<%= link_to article.title, article %>
Deleting and Article
https://guides.rubyonrails.org/getting_started.html#deleting-an-article
今では data-turbo-method
, data-turbo-confirm
を使うのだなあ
あとは Basic authentication を残すのみ
status を enum にして inclusion validation 使いたいな