20200810のRailsに関する記事は12件です。

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 変更したい名前


終わりに

そこまで躓くポイントはありませんでした。

参考文献
Ruby on Rails Tutorial

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】検索結果でCSV出力する方法【Ransack】

問題

CSV出力機能を実装した際に、そのページに検索機能(ransack gem)があることに気づいた。
検索結果をCSVファイルに反映する方法をいろいろ調べたのですが、実装するのにけっこう紆余曲折してしまったので記録として残しておきます。

前提

バージョン

Ruby 2.5
Rails 5.1
Ransack 2.1.1

実装前のソースコード

controllers/items_controller.rb
class 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.rb
  def 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
  end

CSV出力の設定に関してはこの記事では触れないので、他の方の記事なども参考にしてください。

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: ' &lt 前へ', next_label: '次へ &gt') %>
  </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>

①検索前
キャプチャ1.JPG

②検索後
キャプチャ2.JPG

上記の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

ちなみに、実は検索後のページに遷移してなくても、検索項目に値が入っているだけでそちらを反映したデータが出力されるので注意してください。

検索前(検索項目に入力済み)③
image.png

出力結果

ID 名前 所有者名
2 item1 user2

検索ボタンをdisableにしない方法

出力ボタンを押した後、検索ボタンが押せないようになっています。
これはRailsの機能で、submitボタンが2回クリックされてしまうとHTTPリクエストが重複してしまい、バックエンド側で検出できなくなる可能性があるため、それを防止するためにある機能です。

参考:railsガイドの「3.4 入力を自動で無効にする」
https://railsguides.jp/working_with_javascript_in_rails.html#入力を自動で無効にする

image.png

データ出力した後に検索機能を使う可能性は低いと思いますが、念のため直しておきましょう。
検索ボタンに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出力後も検索ボタンが非活性にならないようになりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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">

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初期設定

素早くcloud9で環境構築したいときの手順(自分用)

何か実験したい時などに新しく環境を構築する

$ gem install rails -v 5.1.6
rails _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

以上

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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妻・・・・・の関係はなんですか?
と世間(パソコン)に聞かれたときに”一夫多妻”という名前があれば
世間(パソコン)は”あーなるほど”と解釈できるわけです!

もっとも、世間で受け入れられるかどうかはわからないので
そういう意味ではプログラムは感情もなく受け入れてくれる存在ですね笑

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails6の環境をdockerとmysqlで構築(メモ)

はじめに

個人用のメモです。
業務でほとんどdocker使わないので、忘れてしまいそうなので。。。
また、パーフェクトRuby on Railsを参考にしています。

ファイル構成

/app
|--- docker-compose.yml
|--- Dockerfile
|--- Gemfile
|--- Gemfile.lock
|--- .env

Rails用のイメージを作成

ファイル

Dockerfile
FROM 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
# エラーになるが繋がったのを確認

コンテナが作れるの確認して作成したコンテナとイメージを削除し、新しくイメージを作成しました。
DockerfileDockerfile.devに変更しています。

docker-composeの作成

ファイル

docker-compose.dev.yml
version: '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
.env
COMPOSE_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.0

Mysql用のコンテナ作成

docker-compose.ymlに追記。

ファイル

docker-compose.yml
version: '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.yml
default: &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

いつもの画面が出れば完成。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.rb
test "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.rb
  test "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.rb
    patch user_path(@other_user), params: { user: { password: @other_user.password,
                                                    password_confirmation: @other_user.password_confirmation,
                                                    admin: true } }

私の答えは、前の演習にならってパスワードは""としました。

users_controller_test.rb
    patch user_path(@other_user), params: {
                                     user: { password:              "",
                                             password_confirmation: "",
                                             admin: true } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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 ssh

2.yumを最新版にアップデート

ターミナル
$ sudo yum -y update

3.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.24

4.PostgreSQLを初期化

ターミナル
$ sudo postgresql-setup initdb

5.PostgreSQLを起動

ターミナル
$ sudo service postgresql start

6.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 postgresql

9.database.ymlを編集

templateは、まっさらなデータベースを作成することが出来るtemplate0を指定する。

config/database.yml
default: &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 : テーブル一覧表示

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【超初心者的】Rails 多言語化対応

設定

27行目あたり。タイムゾーン設定の下に追加

config/application.rb
config.i18n.default_locale = :ja

gem

末尾に追記

config/Gemfile
gem 'rails-i18n', '~> 6'

インストール

ターミナル
% bundle install

翻訳ファイルの作成

config/ja.yml
ja:
  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>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【超初心者的】Rails テーブル操作

カラムの追加

ターミナル
% bin/rails g migration AlterMenus

日付のついたファイルが自動的に作成されるので、ファイルを編集。
以下は「menus」というテーブルに「shop」というカラムを「string型」で登録する例。

db/migrate/20200702105650_alter_menus
  def 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がマイグレーション済み

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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:resetrails db:migrateを分けて実行すると解決する。

ターミナル
$ rails db:reset

$ rails db:migrate

 私はこれでは解決しなかった。

2. rails db:resetの代わりに以下のコマンドを(これで解決!)

ターミナル
$ rm db/development.sqlite3
$ bin/rails db:setup

3. rails db:migrate:resetの代わりに以下のコマンドを

ターミナル
$ rm db/development.sqlite3
$ bin/rails db:create db:migrate

rails 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した

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】ArgumentError: Malformed version number string 0.32+gitでwebpacker:installが実行できない場合の対処方法

はじめに

webpacker:installを実行すると表題のエラーメッセージが表示されてしまい、Railsが実行できない状況が起きました。
今回はこの現象の回避方法についてまとめます。

この記事の対象者

  • 表題のエラーメッセージが表示され、webpacker:installを実行できない人

実際にどのようなエラーになるのか

エラーに遭遇した環境

Docker公式のRuby:2.7.1を利用したコンテナで遭遇しました。
他の環境では試していないため、同じ方法で対処できると断定はできませんが、参考になればと思います。
使用したDockerfileとRailsのバージョンは以下の通りです。

Dockerfile
FROM 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のプルダウンメニューから環境に合わせて確認してください。)

Dockerfile
FROM 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.4

webpacker: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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む