- 投稿日:2020-08-10T23:11:21+09:00
rails tutorial 第1章
はじめに
独学でrails tutorialを進めていく過程を投稿していきます。
進めていく上でわからなかった単語、詰まったエラーなどに触れています。
個人の学習のアウトプットなので間違いなどあればご指摘ください。
初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。
第一章 ゼロからデプロイまで
1.2.2 Railsをインストールする
Q..
yarmなるもののインストール指示されたがいったい何だろう
A..
JavaScriptソフトウェアの依存関係を管理するプログラムらしい(javascriptのパッケージマネージャ―)
1.3.1 Bundler
エラー発生!!
bundle install時に早速エラーに遭遇した
遭遇したエラー
[!] There was an error parsing `Gemfile`: Illformed requirement ["-> 3.2.1"]. Bundler cannot continue. # from C:/environment/hello_app/Gemfile:36 # ------------------------------------------- # # Windows does not include zoneinfo files, so bundle the tzinfo-data gem > gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] # source 'https://rubygems.org' # -------------------------------------------解決
# from C:/environment/hello_app/Gemfile:36 ↑にインストールに失敗した箇所が表示されているのでそこを修正
1.4 Gitによるバージョン管理
余談
ブランチの名前を間違えてしまったが簡単に変更できた
git branch -m 変更したい名前
終わりに
そこまで躓くポイントはありませんでした。
- 投稿日:2020-08-10T22:10:08+09:00
【Rails】検索結果でCSV出力する方法【Ransack】
問題
CSV出力機能を実装した際に、そのページに検索機能(ransack gem)があることに気づいた。
検索結果をCSVファイルに反映する方法をいろいろ調べたのですが、実装するのにけっこう紆余曲折してしまったので記録として残しておきます。前提
バージョン
Ruby 2.5
Rails 5.1
Ransack 2.1.1実装前のソースコード
controllers/items_controller.rbclass ItemsController < ApplicationController def index @q = Item.ransack(params[:q]) @items = @q.result respond_to do |format| format.html format.csv do send_data @items.export, filename: "items_export.csv" end end end endコントローラーにメソッドを書くとごちゃごちゃしてしまうので、実装はモデルに書きます。
models/item.rbdef self.export CSV.generate(encoding: Encoding::SJIS, row_sep: "\r\n", force_quotes: true) do |csv| csv << %w( ID 名前 所有者名 ) all.each do |item| id = item.id name = item.name user = user.name csv << [ id, name, user ] end end endCSV出力の設定に関してはこの記事では触れないので、他の方の記事なども参考にしてください。
views/items/index.html.erb<div> <h4>アイテム一覧</h4> <%= search_form_for(@q, url: items_path) do |f| %> <div> <%= link_to 'データ出力', purchase_orders_path(format: :csv), class: 'uk-button uk-button-secondary uk-button-small create-button' %> </div> <div> <div class="uk-grid-small uk-grid"> <%= f.label :id_cont, 'ID', class: 'uk-form-label search-label' %> <div class="uk-form-controls"> <%= f.search_field :id_cont, class: 'uk-input uk-form-small' %> </div> <%= f.label :name_cont, '名前', class: 'uk-form-label search-label' %> <div class="uk-form-controls"> <%= f.search_field :name_cont, class: 'uk-input uk-form-small uk-form-width-small' %> </div> <%= f.label :user_cont, '所有者名', class: 'uk-form-label search-label' %> <div class="uk-form-controls"> <%= f.search_field :usere_cont, class: 'uk-input uk-form-small uk-form-width-medium' %> </div> <%= f.submit '検索', class: 'uk-button uk-button-secondary uk-button-small mr15' %> <%= link_to 'クリア', url_for, class: 'uk-button uk-button-default uk-button-small' %> </div> </div> <% end %> <div> <%= will_paginate(@items, previous_label: ' < 前へ', next_label: '次へ >') %> </div> <table class="uk-table uk-table-striped table-th uk-table-small"> <thead> <tr> <th><%= sort_link(@q, :id, 'ID') %></th> <th><%= sort_link(@q, :name, '名前') %></th> <th><%= sort_link(@q, :user, '所有者名') %></th> </tr> </thead> <tbody> <% @items.each do |item| %> <tr> <td><%= item.id %></td> <td><%= item.name %></td> <td><%= item.user%></td> </tr> <% end %> </tbody> </table> </div>上記のviewで書いたような出力ボタンの場合、検索前①も検索後②も下記のようにcontrollerのindexで取得していた値が全てCSVに出力されます。つまり、検索結果は反映されません。
出力結果
ID 名前 所有者名 1 item1 user1 2 item1 user2 3 item1 user2 4 item1 user2 5 item1 user2 解決策
出力ボタンの書き方を変えます。
views/items/index.html.erb<div> <h4>アイテム一覧</h4> <%= search_form_for(@q, url: items_path) do |f| %> <div> <button type='submit' name='format' value='csv' class='uk-button uk-button-secondary uk-button-small create-button'> データ出力 </button> </div> ~~~~~~~~ </div>これで検索後②の結果を反映したCSVが出力できるようになります。
本当はRailsっぽく
f.submit
を使って実装したかったのですが、これを使う場合format
属性はsearch_for_form
に入れる必要があるんですよね。そうすると、検索機能自体が上手くいかなくなってしまうので、止む無くこの書き方にしました。
もっときれいな書き方を知ってる方がいたらぜひ教えてください。出力結果
ID 名前 所有者名 1 item1 user1 ちなみに、実は検索後のページに遷移してなくても、検索項目に値が入っているだけでそちらを反映したデータが出力されるので注意してください。
出力結果
ID 名前 所有者名 2 item1 user2 検索ボタンをdisableにしない方法
出力ボタンを押した後、検索ボタンが押せないようになっています。
これはRailsの機能で、submit
ボタンが2回クリックされてしまうとHTTPリクエストが重複してしまい、バックエンド側で検出できなくなる可能性があるため、それを防止するためにある機能です。参考:railsガイドの「3.4 入力を自動で無効にする」
https://railsguides.jp/working_with_javascript_in_rails.html#入力を自動で無効にするデータ出力した後に検索機能を使う可能性は低いと思いますが、念のため直しておきましょう。
検索ボタンにdata-disable-with
を追記します。views/items/index.html.erb<div> ~~~~~~~~ <%= f.submit '検索', class: 'uk-button uk-button-secondary uk-button-small mr15', 'data-disable-with' => false %> <%= link_to 'クリア', url_for, class: 'uk-button uk-button-default uk-button-small' %> </div> </div> <% end %> ~~~~~~~~ </div>これでCSV出力後も検索ボタンが非活性にならないようになりました。
- 投稿日:2020-08-10T22:01:36+09:00
railsでページをリロードしないとJSが機能しない件
タイトル通りJSのイベントが起きるためにリロードが必要な状況を改善したい。
検索すると以下の参考記事があったので、素直にgemfileとapprication.jsを変更し対応しようとしたがうまくいかない。
https://qiita.com/Terunaga/items/19d4f49f3abd3316f098別の記事で以下のようにjsのリロードが必要なページに追記することで解決できた。
http://taremimi.hatenablog.jp/entry/2018/06/06/085030
<body data-turbolinks="false">
- 投稿日:2020-08-10T21:27:59+09:00
初期設定
素早くcloud9で環境構築したいときの手順(自分用)
何か実験したい時などに新しく環境を構築する
$ gem install rails -v 5.1.6rails _5.1.6_ new お好きな名前gemfile
source 'https://rubygems.org' gem 'rails', '~> 5.1.6' gem 'puma', '~> 3.7' gem 'sass-rails', '~> 5.0' gem 'uglifier', '>= 1.3.0' gem 'coffee-rails', '~> 4.2' gem 'jquery-rails' gem 'turbolinks', '~> 5' gem 'jbuilder', '~> 2.5' group :development, :test do gem 'sqlite3' gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] end group :development do gem 'web-console', '>= 3.3.0' gem 'listen', '>= 3.0.5', '< 3.2' gem 'spring' gem 'spring-watcher-listen', '~> 2.0.0' end # Windows環境ではtzinfo-dataというgemを含める必要があります # Mac環境でもこのままでOKです gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]$ bundle$ rails s以上
- 投稿日:2020-08-10T21:11:49+09:00
has_manyとbelong_toの関係
has_many と belong_toは
一夫多妻制!!!これに尽きます!!
そもそもこの役割があるのは、
データベースとデータベースを紐づけるためにあります!たとえば "user" と "memos"というデーターベースがあります。
"user"(単数形)なので一人しかいません(一夫)
”memos"(複数形)なのでたくさんのデータがあります(多妻)”user”→”memos” は”has_many”
”memos→”user" は”belong_to”です。この紐付けを行うことでA夫は、B妻C妻・・・の籍を入れており
(日本ですと犯罪なのでそんなことはしないように笑)
B妻C妻・・・・はA夫の籍を入れていることになります!では紐付けないとどうなるかというと、
浮気・不倫になってしまいます><A夫とB妻は籍を入れているのに、
C妻にA夫がいると”その関係はなんなの!?!?”
と世間(パソコン)に怒られてしまい揉め事(エラー)になってしまいます!なのでA夫B妻C妻・・・・・の関係はなんですか?
と世間(パソコン)に聞かれたときに”一夫多妻”という名前があれば
世間(パソコン)は”あーなるほど”と解釈できるわけです!もっとも、世間で受け入れられるかどうかはわからないので
そういう意味ではプログラムは感情もなく受け入れてくれる存在ですね笑
- 投稿日:2020-08-10T20:32:41+09:00
rails6の環境をdockerとmysqlで構築(メモ)
はじめに
個人用のメモです。
業務でほとんどdocker使わないので、忘れてしまいそうなので。。。
また、パーフェクトRuby on Railsを参考にしています。ファイル構成
/app |--- docker-compose.yml |--- Dockerfile |--- Gemfile |--- Gemfile.lock |--- .envRails用のイメージを作成
ファイル
DockerfileFROM ruby:2.7.1 RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - \ && echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list \ && apt-get update \ && apt-get install -y build-essential nodejs yarn RUN gem install bundler WORKDIR /app RUN bundle config set path vendor/bundle CMD ["bash"]コマンド(コンテナが作れるか確認)
$ docker build . $ docker images $ docker volume create app_bundle $ docker volume create app_node_modules $ docker colume ls $ docker run -it -v <現在のディレクトリの絶対パス>:/app \ -v app_bundle:/app/vendor/bundle \ -v app_node_modules:/app/node_modules \ -p 3000:3000 <IMAGE ID> ### コンテナの中 ### # bundle install # bundle exec rails new . --force --webpack=vue --skip-turbolinks --skip-test -d mysql # bin/rails webpacker:install # bin/rails s -b 0.0.0.0 # エラーになるが繋がったのを確認コンテナが作れるの確認して作成したコンテナとイメージを削除し、新しくイメージを作成しました。
DockerfileをDockerfile.devに変更しています。docker-composeの作成
ファイル
docker-compose.dev.ymlversion: '3' services: web: build: context: . dockerfile: Dockerfile.dev ports: - '3000:3000' volumes: - .:/app - app_bundle:/app/vendor/bundle - app_node_modules:/app/node_modules tty: true stdin_open: true volumes: app_bundle: driver: local app_node_modules: driver: local.envCOMPOSE_FILE=<docker-compose.dev.ymlのファイルのパス>Gemfile### bundle initで作成 railsのバージョンのみ変更### # frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem 'rails', '~> 6'コマンド
$ docker-compose up -d $ docker-compose ps $ docker-compose exec web bash ### コンテナ内 ### # bundle # bundle exec rails new . --force --webpack=vue --skip-turbolinks --skip-test -d mysql # bin/rails s -b 0.0.0.0Mysql用のコンテナ作成
docker-compose.ymlに追記。
ファイル
docker-compose.ymlversion: '3' services: web: build: context: . dockerfile: Dockerfile.dev environment: MYSQL_USERNAME: app_dev_user MYSQL_PASSWORD: password MYSQL_HOST: mysql ports: - '3000:3000' volumes: - .:/app - app_bundle:/app/vendor/bundle - app_node_modules:/app/node_modules tty: true stdin_open: true depends_on: - mysql mysql: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: password command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - 3306:3306 volumes: - mysql-data:/var/lib/mysql volumes: app_bundle: driver: local app_node_modules: driver: local mysql-data: driver: localコマンド
$ docker-compose up -d mysql $ docker-compose exec mysql mysql -u root -p ### コンテナ内(mysql) ### mysql> create user app_dev_user@"%" identified by 'password'; mysql> grant all on app_development.* to app_dev_user@"%"; mysql> grant all on app_test.* to app_dev_user@"%";RailsとMysqlを繋ぐ
database.ymlの修正
database.ymldefault: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: <%= ENV.fetch("MYSQL_USERNAME") { app_dev_user } %> password: <%= ENV.fetch("MYSQL_PASSWORD") { password } %> host: <%= ENV.fetch("MYSQL_HOST") { mysql } %>DBの作成
$ docker-compose exec web bash ### コンテナ内(Rails) ### # bin/rails db:create # bin/rails s -b 0.0.0.0いつもの画面が出れば完成。
- 投稿日:2020-08-10T13:48:20+09:00
Rails Tutorial 第10章完了
2020/7/29 0.5時間
リンクを作る前まで進めました。
2020/7/30 0.5時間
演習10.1.1でエラーになり、朝やっているのですが時間切れになりました。
フィッシング対策で"noopener"を設定するのは知りませんでした。
2020/7/31 0.5時間
演習10.1.1のprovideが理解できず時間がかかりました。
2020/8/1 1.5時間
休みなので時間がとれました。
10.1まで完了しました。2020/8/2 2時間
途中難しくて寝てしまいますが、朝なので続けられました。夜だと続けれれなかったと思います。
testがエラーで、入力間違いが見つけられません。2020/8/3 1時間
この日は出社日で、朝は時間がとれなかったので、夜にやりました。前日の入力間違いを見つけられました。
2020/8/4 0.5時間
10.2.3まで進めました。
2020/8/5 2.0時間
夏休み1週間が始まりました。
10.3.1の途中まで進めました。2020/8/6 2.0時間
10.3.1完了しました。
途中寝てしまいますが、続けられました。2020/8/7 2.5時間
これで10章が終わりました。
8/5から夏休みに入り、はかどりました。
所要時間は13.0時間です。演習10.2.3.1 testを一連の流れでテストしてみました
次回以降のログインのときには、転送先のURLはデフォルト (プロフィール画面) に戻っている必要があります。
の一連を
EDIT画面,ログイン、EDIT画面、ログアウト、ログイン、SHOW画面
の流れでテストしてみました。users_edit_test.rbtest "friendly forwarding only once" do get edit_user_path(@user) assert_equal session[:forwarding_url], edit_user_url(@user) log_in_as(@user) assert_redirected_to edit_user_url(@user) delete logout_path assert_nil session[:forwarding_url] log_in_as(@user) assert_redirected_to @user follow_redirect! assert_template 'users/show' end演習10.3.1.1 ログアウト後にメニューが減る項目も入れました
冗長な気もしますが、ログアウト後にメニューが減ることも確認するテスト項目も入れました。
ネットの他の方の解答と比べると、少し項目が多いです。
デフォルトの画面->ログイン後の画面->ログアウト後の画面
でメニューの項目が増減するのをテストしたいと考えました。site_layout_test.rbtest "layout links" do get root_path assert_template 'static_pages/home' assert_select "a[href=?]", root_path, count: 2 assert_select "a[href=?]", help_path assert_select "a[href=?]", about_path assert_select "a[href=?]", contact_path get contact_path assert_select "title", full_title("Contact") get signup_path assert_select "title", full_title("Sign up") end test "login logout links" do log_in_as(@user) follow_redirect! assert_template 'users/show' assert_select "a[href=?]", root_path, count: 2 assert_select "a[href=?]", help_path assert_select "a[href=?]", users_path assert_select "a[href=?]", user_path(@user) assert_select "a[href=?]", edit_user_path(@user) assert_select "a[href=?]", login_path, count: 0 assert_select "a[href=?]", logout_path # after logout delete logout_path follow_redirect! assert_template 'static_pages/home' assert_select "a[href=?]", root_path, count: 2 assert_select "a[href=?]", help_path assert_select "a[href=?]", users_path, count:0 assert_select "a[href=?]", user_path(@user), count:0 assert_select "a[href=?]", edit_user_path(@user), count:0 assert_select "a[href=?]", login_path assert_select "a[href=?]", logout_path, count: 0 end演習10.4.1.1 testでpasswordは入れる必要がないのでは
testでpasswordは入れる必要がないように思いました。
ネットの他の方の解答では、パスワードを入力していました。
users_controller_test.rbpatch user_path(@other_user), params: { user: { password: @other_user.password, password_confirmation: @other_user.password_confirmation, admin: true } }私の答えは、前の演習にならってパスワードは""としました。
users_controller_test.rbpatch user_path(@other_user), params: { user: { password: "", password_confirmation: "", admin: true } }
- 投稿日:2020-08-10T13:17:10+09:00
【Rails】Vagrant環境でPostgreSQLを使用する方法
開発環境
・Ruby: 2.5.7
・Rails: 5.2.4
・Vagrant: 2.2.7
・VirtualBox: 6.1
・PostgreSQL: 9.2.24
・OS: macOS Catalina実装
1.
vagrant ssh
へログインターミナル$ vagrant ssh2.
yum
を最新版にアップデートターミナル$ sudo yum -y update3.
PostgreSQL
をインストールターミナル$ sudo yum -y install postgresqlターミナル$ sudo yum -y install postgresql-develターミナル$ sudo yum -y install postgresql-server
psql --version
を実行して、バージョンが表示されればインストール完了です。ターミナル$ psql --version psql (PostgreSQL) 9.2.244.
PostgreSQL
を初期化ターミナル$ sudo postgresql-setup initdb5.
PostgreSQL
を起動ターミナル$ sudo service postgresql start6.
PostgreSQL
のアカウントを作成し、ログインするターミナル$ sudo -u postgres psqlターミナルpostgres=# create role [任意のユーザー名] with createdb login password '[任意のパスワード]';
\du
を実行してRoleが追加されていればアカウント作成完了です。ターミナルpostgres=# \du List of roles Role name | Attributes | Member of -------------+------------------------------------------------+----------- [任意のユーザー名] | Create DB | {} postgres | Superuser, Create role, Create DB, Replication | {}7.データベースを確認
手順4の
sudo postgresql-setup initdb
で作成されたデータベースを確認する。ターミナルpostgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+----------+-----------+---------+-------+----------------------- postgres | postgres | SQL_ASCII | C | C | template0 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | SQL_ASCII | C | C | =c/postgres + | | | | | postgres=CTc/postgres (3 rows)※ template0とtemplate1の違いについては下記記事を参考にしてください。
PostgreSQLのtemplate0とtemplate1の違い
8.Railsアプリを作成
デフォルトのデータベースがSQLiteなので、
-d
オプションでPostgreSQLを指定する。ターミナル$ rails new sample -d postgresql9.
database.yml
を編集templateは、まっさらなデータベースを作成することが出来る
template0
を指定する。config/database.ymldefault: &default adapter: postgresql encoding: unicode template: template0 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: 手順6で設定したユーザー名 password: 手順6で設定したパスワード10.データベースを作成
ターミナル$ rails db:create※
FATAL: Ident authentication failed for user
というエラーが出る場合① PostgreSQLの設定ファイルを開く。
ターミナル$ sudo vi /var/lib/pgsql/data/pg_hba.conf② 最下部にある認証方式を編集する。
METHODを
md5
に変更してください。pg_hba.conf. . . # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all md5 # IPv4 local connections: host all all 127.0.0.1/32 md5 # IPv6 local connections: host all all ::1/128 md5【よく使う認証方式】
ident
: DBの所有者が、シェルを実行しているOSのユーザ名と一致するかで認証する、
md5
: パスワードで認証する。
trust
: 認証なし。よく使うコマンド
【ログイン前】
sudo service postgresql start
: 起動
sudo service postgresql stop
: 停止
sudo service postgresql restart
: 再起動
sudo -u postgres psql
: ログイン【ログイン後】
\q
: ログアウト
\?
: ヘルプ表示
\l
: データベース一覧表示
\du
: ユーザー一覧表示
\c データベース名
: データベースへ接続
\z
: テーブル一覧表示
- 投稿日:2020-08-10T11:03:56+09:00
【超初心者的】Rails 多言語化対応
設定
27行目あたり。タイムゾーン設定の下に追加
config/application.rbconfig.i18n.default_locale = :jagem
末尾に追記
config/Gemfilegem 'rails-i18n', '~> 6'インストール
ターミナル% bundle install
翻訳ファイルの作成
config/ja.ymlja: activerecord: models: menu: メニュー attributes: menu: name: 商品名 price: 値段 description: 説明Railsサーバ再起動で読み込まれる
使用例
自動的に
ja.yml
に記載した日本語で表示されるformの場合
<%= form.label :name %> <%= form.label :price %> <%= form.label :description %>tableの場合
<th><%= Menu.human_attribute_name(:name) %></th> <th><%= Menu.human_attribute_name(:price) %></th> <th><%= Menu.human_attribute_name(:description) %></th>
- 投稿日:2020-08-10T10:43:44+09:00
【超初心者的】Rails テーブル操作
カラムの追加
ターミナル% bin/rails g migration AlterMenus
日付のついたファイルが自動的に作成されるので、ファイルを編集。
以下は「menus」というテーブルに「shop」というカラムを「string型」で登録する例。db/migrate/20200702105650_alter_menusdef change add_column :menus, :shop, :string endマイグレーション実行
ターミナル% bin/rails db:migrate
ロールバック操作
1つ前に戻す
ターミナル% bin/rails db:rollback
3つ前に戻して再度migrationを実行
ターミナル% rake db:migrate:redo step=3
指定のバージョンに戻す
ターミナル% bin/rails db:migrate VERSION=20200711134004
データベースリセット
ターミナル% bin/rails db:migrate:reset
マイグレーション状況確認
ターミナル% rake db:migrate:status database: XXXXX_development Status Migration ID Migration Name -------------------------------------------------- up 20200702112828 Create menus up 20200706110055 Create users up 20200706111024 Add admin to users up 20200711035746 Create shops up 20200711134004 Add shop id to menus up 20200718044031 Create reviews
upがマイグレーション済み
- 投稿日:2020-08-10T06:43:08+09:00
rails db:migrate:resetでのエラー
プログラミングの勉強日記
2020年8月10日 Progate Lv.226
rails db:migrateでのエラーという記事でマイグレーションファイルを操作するときにエラーが起きて、rails db:migrate:reset
で対処すると述べたが、このrails db:migrate:reset
を使おうとするとエラーが出たのでこれの対処をする。エラー内容
Rails自体のバグ(?)で、Windowsでは自分がアクセスしてるファイルを削除できないことが問題になっているみたい、、
ターミナル$ rails db:migrate:reset C:/Ruby26-x64/lib/ruby/2.6.0/x64-mingw32/etc.so: warning: already initialized constant Struct::Passwd le::VERSION C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/forwardable-1.3.1/lib/forwardable/version.rb:3: warning: previous definition of VERSION was here C:/Ruby26-x64/lib/ruby/2.6.0/forwardable.rb:117: warning: already initialized constant Forwardable::FORWARDABLE_VERSION C:/Ruby26-x64/lib/ruby/gems/2.6.0/gems/forwardable-1.3.1/lib/forwardable/version.rb:4: warning: previous definition of FORWARDABLE_VERSION was here DEPRECATION WARNING: Single arity template handlers are deprecated. Template handlers must now accept two parameters, the view object and the source for the view object. Change: >> Coffee::Rails::TemplateHandler.call(template) To: >> Coffee::Rails::TemplateHandler.call(template, source) (called from <top (required)> at C:/Users/Owner/mysite/ruby/travel/Rakefile:6) Permission denied @ apply2files - C:/Users/Owner/mysite/ruby/travel/db/development.sqlite3 Couldn't drop database 'db/development.sqlite3' rails aborted! Errno::EACCES: Permission denied @ apply2files - C:/Users/Owner/mysite/ruby/travel/db/development.sqlite3 bin/rails:4:in `require' bin/rails:4:in `<main>' Tasks: TOP => db:drop:_unsafe (See full trace by running task with --trace)解決方法(結論)
db/development.sqlite3
を手動で削除したらデータベースをリセットすることができた。ターミナル$ rm db/development.sqlite3 $ bin/rails db:setup対処法
1.rails db:resetをする
rails db:migrate:reset
でデータベースのリセットとmigrateの実行を同時に行うと失敗する。なので、マイグレーションファイル内の実行する順番に問題がある可能性があり、rails db:reset
とrails db:migrate
を分けて実行すると解決する。ターミナル$ rails db:reset $ rails db:migrate私はこれでは解決しなかった。
2. rails db:resetの代わりに以下のコマンドを(これで解決!)
ターミナル$ rm db/development.sqlite3 $ bin/rails db:setup3. rails db:migrate:resetの代わりに以下のコマンドを
ターミナル$ rm db/development.sqlite3 $ bin/rails db:create db:migraterails db:resetとrails db:migration:resetの違い
rails db:reset:
db/schema.rb
を元にデータベース作成するdb/migrate/〇〇.rb
は使わない。
rails db:migrate:reset:データベースを削除した後にdb/migrate/〇〇.rb
を古い順から実行する。参考文献
db:migrate:reset でエラーが出ます
rails db:migrate:resetできなかったのでrails db:resetした
- 投稿日:2020-08-10T01:05:39+09:00
【Rails】ArgumentError: Malformed version number string 0.32+gitでwebpacker:installが実行できない場合の対処方法
はじめに
webpacker:install
を実行すると表題のエラーメッセージが表示されてしまい、Railsが実行できない状況が起きました。
今回はこの現象の回避方法についてまとめます。この記事の対象者
- 表題のエラーメッセージが表示され、
webpacker:install
を実行できない人実際にどのようなエラーになるのか
エラーに遭遇した環境
Docker公式の
Ruby:2.7.1
を利用したコンテナで遭遇しました。
他の環境では試していないため、同じ方法で対処できると断定はできませんが、参考になればと思います。
使用したDockerfileとRailsのバージョンは以下の通りです。DockerfileFROM ruby:2.7.1 LABEL maintainer="TomoProg" RUN apt-get update -qq && apt-get install -y \ build-essential \ libpq-dev \ nodejs \ default-mysql-client \ vim-tiny RUN apt-get install -y yarn RUN mkdir /myapp WORKDIR /myapp$ rails --version Rails 6.0.3.2実際のエラーメッセージ
webpacker:install
を実行すると以下のようなエラーメッセージが表示されました。root@3cd2b69c861a:/myapp# bin/rails webpacker:install rails aborted! ArgumentError: Malformed version number string 0.32+git /usr/local/bundle/gems/webpacker-4.2.2/lib/tasks/webpacker/check_yarn.rake:12:in `block (2 levels) in <main>' /usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands/rake/rake_command.rb:23:in `block in perform' /usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands/rake/rake_command.rb:20:in `perform' /usr/local/bundle/gems/railties-6.0.3.2/lib/rails/command.rb:48:in `invoke' /usr/local/bundle/gems/railties-6.0.3.2/lib/rails/commands.rb:18:in `<main>' /usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require' /usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi' /usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register' /usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi' /usr/local/bundle/gems/bootsnap-1.4.7/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require' /usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in `block in require' /usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:291:in `load_dependency' /usr/local/bundle/gems/activesupport-6.0.3.2/lib/active_support/dependencies.rb:324:in `require' /myapp/bin/rails:9:in `<top (required)>' /usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `load' /usr/local/bundle/gems/spring-2.1.0/lib/spring/client/rails.rb:28:in `call' /usr/local/bundle/gems/spring-2.1.0/lib/spring/client/command.rb:7:in `call' /usr/local/bundle/gems/spring-2.1.0/lib/spring/client.rb:30:in `run' /usr/local/bundle/gems/spring-2.1.0/bin/spring:49:in `<top (required)>' /usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `load' /usr/local/bundle/gems/spring-2.1.0/lib/spring/binstub.rb:11:in `<top (required)>' /myapp/bin/spring:15:in `<top (required)>' bin/rails:3:in `load' bin/rails:3:in `<main>' Tasks: TOP => webpacker:install => webpacker:check_yarn (See full trace by running task with --trace)原因
webpacker:install
する際にyarn
が必要なのですが、
そのままapt-get
でインストールすると0.32+git
というバージョンでインストールされてしまい、
webpack:install
した際に行われるyarn
のバージョンチェック時にエラーが出てしまうようです。
ちなみにyarn
のバージョンは以下のコマンドで確認できます。$ yarn --version 0.32+git対処方法
yarn
の公式サイトに掲載されているこちらのインストール方法を参考に、安定版で最新のyarn
をインストールするようにDockerfileを下記のように変更しました。
(このインストール方法はUbuntu/Debian
でのインストール方法です。別のOSの場合はリンク先のOperating System
のプルダウンメニューから環境に合わせて確認してください。)DockerfileFROM ruby:2.7.1 # -- 省略 -- # そのままapt-getでインストールする方法ではなく #RUN apt-get install -y yarn # 公式のインストール方法を参考に安定版で最新のyarnをインストールする RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - RUN echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list RUN apt-get update && apt-get install yarn # -- 省略 --その結果、
yarn
のバージョンが変わり、webpacker:install
が正常に完了するようになりました。
実際のyarn
のバージョンとwebpacker:install
の実行結果は下記の通りです。yarnのバージョン確認
$ yarn --version 1.22.4webpacker:installの実行結果
root@cb295863c75e:/myapp# bin/rails webpacker:install create config/webpacker.yml Copying webpack core config create config/webpack create config/webpack/development.js create config/webpack/environment.js create config/webpack/production.js create config/webpack/test.js Copying postcss.config.js to app root directory create postcss.config.js -- 省略 -- ├─ thunky@1.1.0 ├─ type-is@1.6.18 ├─ unpipe@1.0.0 ├─ utils-merge@1.0.1 ├─ wbuf@1.7.3 ├─ webpack-dev-middleware@3.7.2 ├─ webpack-dev-server@3.11.0 └─ ws@6.2.1 Done in 280.04s. Webpacker successfully installed ? ?まとめ
ArgumentError: Malformed version number string 0.32+git
が起きた際の対処方法をまとめてみました。
同じようなエラーで困っている方に参考になればと思います。それでは良いRailsライフを!
TomoProg