- 投稿日:2020-08-05T23:22:01+09:00
Rails herokuにデプロイ後にAPIキーが見当たらなかった時の解決方法
実装した機能
gem geocoder
を使って入力した住所から緯度、経度を取得。
Google API Keyを取得してアプリ上に地図表示。発生した問題
開発環境では問題なく動作していたがデプロイ後に本番環境で
動作チェックすると入力した住所に対して地図が表示されず何も返してくれなかった。推測してみた
コンソールをチェックすると
No Apikeys
、Invalidkey
と出ていたので、APIキーが原因であると推測。APIの知識が不足していたので開発環境で書いているコードの問題かGoogle APIの設定の方に問題があるのか?
と考えて深掘りしていくが解決出来そうな記事は見当たらず。ちなみにAPIキーは
gem "dotenv-rails"
を使い、.env
の中の環境変数に入れて.gitignore
の中に隠してました。Chromeの拡張機能であるGoogle Maps Platform API Checkerを入れてみると、
エラーの文字と、APIキーを入れたコードの一文が表示されているのを確認できたがAPIキー自体が見当たらない。つまり環境変数が呼び出されていないということ。
問題解決
ここでむやみやたらとググりまくると沼にハマる姿が目に浮かんだので(笑)
いったん落ち着いて考えてみることにしました。・・・もしかしてherokuにデプロイしてるのが原因かな??
ということでググってみるとこれがビンゴ!
herokuでは.gitignoreに入っているファイルはデプロイされないらしく
heroku config:set
で環境変数をセットする必要があるとのことでした。こちらの記事を参考にさせていただきherokuに環境変数をセット。
無事解決できました!!!
- 投稿日:2020-08-05T23:16:29+09:00
Puma - Nignx って環境で rails s -e production -d でうまくいかない時の逃げ道
前提
EC2 に Rails6 + Puma + Nginxでデプロイしてて
かつ EC2にSSH接続したターミナルでrails s -e productionでは問題なくサービスが表示されているのに
rails s -e production -dではエラー画面が表示されるだと?
ええ〜これじゃサービス起動させ続けるのにSSH接続しっぱなしじゃーん
という悩みを抱えたキミ向けだよ!
解決
Railsのルートフォルダにあるconfig/puma.rbに
config/puma.rbdaemonize
って追記するんだ!
これでrails s -e production -dでは起動できないままだけど
rails s -e productionこれでデーモン化されるので解決だよ!
これじゃローカルでもデーモン化されて不便だろって人は
config/puma.rbif Rails.env == 'production' daemonize endって書こうね!誰でも思いつく回避策だね!知ったげに書いてごめんね!
原因
完全に調べきったわけじゃないですが、私がネットサーファーになってgoogleの海を潜った結果、どうやら pumaで"rails s -d" でデーモン化すると puma.rbが読み込まれないみたいです。
rails s -e production -d で起動した際にNginxのエラーログにpuma.rbで設定しているsocketで接続できなかったよ!って記載されていますので、多分あってるんでないかなと思います。コイツはマズイぜ!という点があればご指摘ください!
- 投稿日:2020-08-05T22:06:40+09:00
【orderメソッド】Railsで、データの並び順を設定する
参考対象者
- Railsで、アプリ作ってるけど、あるデータの並び替えをしたいなと思っている方
特定の状況下で、データを並び替えたいとき
基本形
Model.order(Column: :DESC) Model.order("Column DESC")デフォルトでは、ASC(昇順)になっているので、DESC(降順)にすることができる
実際に、並び替えしたデータ群を取得してみる
feed_controller.rb#データベース上の全てのデータを取得 feeds = Feed.order(id: :DESC) #現在ログイン中ユーザーの全てのデータを取得 feeds = current_user.feeds.order(id: :DESC)今回は、Feedモデルというデータを取得してみた。
上は、データベース上の全てのデータを取得し、
下は、現在ログイン中ユーザーの全てのデータを取得している。こうすることで、降順になったデータ群を取得することができる。
デフォルト設定を変更して、並び替えしたいとき
モデルファイルに並び順を設定する
models/feed.rbdefault_scope -> { order(created_at: :desc) }今回も、Feedモデルというデータの並び替え設定をした。
この記法は、ラムダ関数というもので、特殊である。こうすることで、作成した日時(created_at)の降順で、並び替えするようにデフォルト設定を行うことができる。
- 投稿日:2020-08-05T18:16:57+09:00
[ruby]ドリルアウトプット
内容
クラスとインスタンスの概念を用いたコードの作成
上記のコードに追加を行い、以下の出力結果を得られるようにしてください。ただし、クラスとインスタンスを使用するものとします。
実装
まず、3行目〜7行目のinitializeメソッドで宣言されたインスタンス変数に(阿部、Rubyの素晴らしさについて、Awesome Ruby!)を代入したいので、9行目〜19行目でインスタンス変数の値を返すためのインスタンスメソッドをそれぞれ定義します。
そして、21行目でArticleクラスのインスタンスを生成し、変数articleに代入します。
その際に実引数として(阿部、Rubyの素晴らしさについて、Awesome Ruby!)を仮引数に渡してあげます。そうすると何と不思議全て呼び出すことに成功しましたーーーー✨
- 投稿日:2020-08-05T17:11:30+09:00
Railsのルーティングついて
概要
Railsアプリケーションでのルーティングについてまとめました。
今回のゴール
『ルーティングの効果』と『実践的な使い方』を確認することです。
<1>ルーティングの効果
結論
・HTTPリクエストをもとに、コントローラーとアクションに処理を渡せるようになる。
・ヘルパーメソッドにより、コントローラーやビューでパスとURIを作成できるようになる。コントローラーとアクションの指定方法
ルーティングではクライアントからのHTTPリクエストを下記のコードで振り分けます。
ルーティングのイメージ[HTTPメソッド] '[URIのパス]', to: '[コントローラー名]#[アクション名]' 例) get 'samples', to: 'samples#index'つまり、今回の例ですと...
クライアントから『GETメソッド』で『samplesのパス』でアクセスがきたら
Railsアプリケーションの『samplesコントローラー』の『indexアクション』で処理をしますという意味になります。
コントローラーやビューでパスとURLヘルパーが使えるようになる
ルーティングが記述されることにより、Railsアプリケーション内で『_pathメソッド』・『_urlメソッド』使えるようになります。
このメソッドにより、コントローラーでのredirect_toメソッドやビューのlink_toメソッドなどがpathを使って記述できるようになります。_pathメソッド ・ _urlメソッド
『[Prefix]_path』や『[Prefix]_url』のように使うことで、簡単にパスやURL生成するヘルパーメソッドです。
※ Prefixについては後ほど、説明します。
<2> 実践的な使い方
ルーティングの設定場所
config/routes.rb
ファイルになります。config/routes.rbRails.application.routes.draw do get 'samples', to: 'samples#index' endルーティングの確認方法
ターミナルを使い、アプリケーションのディレクトリで
rails routes
とコマンドを実行すると確認できます。ターミナル(アプリケーションのディレクトリ)$ rails routes Prefix Verb URI Pattern Controller#Action samples GET /samples(.:format) samples#index『Prefix』・『Verb』・『URI Pattern』・『Controller#Action』の四つの項目が表示されます。
『VerbとURI Pattern』の組み合わせで、HTTPリクエスト内容を判断して
『Controller#Action』で処理を渡す先を示しています。Prefixとは
『_pathメソッド』・『_urlメソッド』を使う際に利用される、変数のようなものです。
例)samples_path => " /samples "
samples_url => " http://sample.com/samples "Verb(HTTP動詞)とは
処理判断するHTTPメソッドになります。
URI Patternとは
処理判断するURIのパスになります。
Controller#Actionとは
処理を渡すコントローラー名とアクション名になります。
基本の7種類のアクション
Railsには標準的に使う『7種類のアクション』が設定されています。
アクション名 使用目的 index 一覧表示する new 新規のデータフォームを表示する create 新規データを登録する show 特定のデータを表示する edit 特定データの編集フォームを表示する update 特定データを更新する destroy 特定データを削除する 基本的なルーティングの記述方法
大きく分けると2つに分けることが出来ます。
『個別設定』と『一括設定』です。個別設定
ルーティングを1行ずつ設定するコードなります。
Rails.application.routes.draw do get 'samples', to: 'samples#index' post 'samples', to: 'samples#create' put 'samples/:id', to: 'samples#update' end一括設定(リソースベースなルーティング)
複数のルーティング設定を短いコードで書くことが出来ます。
resources (複数形リソース)
1行で7つのアクションのルーティング設定が可能なコードです。
Rails.application.routes.draw do resources :samples end以下の個別設定ルーティングと同じ
Rails.application.routes.draw do get 'samples', to: 'samples#index' post 'samples', to: 'samples#create' get 'samples/new', to: 'samples#new', as: 'new_sample' get 'samples/:id/edit', to: 'samples#edit', as: 'edit_sample' get 'samples/:id', to: 'samples#show', as: 'sample' patch 'samples/:id', to: 'samples#update' put 'samples/:id', to: 'samples#update' delete 'samples/:id', to: 'samples#destroy' end※ asオプション
『as: 'XXX'』とすることで、Prefixに『XXX』と指定することが出来ます。
resource (単数形リソース)
1行でindexアクション以外の6つのアクションのルーティング設定が可能なコードです。
アプリケーション設計の中で、各ユーザーがひとつの情報(リソース)しか持たない時に使います。
ひとつの情報しか持たないため、indexアクション(複数リソースを一覧表示する)がなく
URIのパスに『:id』がつきません。また、コントローラーは複数形になることに注意が必要です。
Rails.application.routes.draw do resource :sample # 単数形になっている end以下の個別設定ルーティングと同じ
Rails.application.routes.draw do post 'sample', to: 'samples#create' get 'sample/new', to: 'samples#new', as: 'new_sample' get 'sample/edit', to: 'samples#edit', as: 'edit_sample' get 'sample', to: 'samples#show', as: 'sample' patch 'sample', to: 'samples#update' put 'sample', to: 'samples#update' delete 'sample', to: 'samples#destroy' end応用的なルーティングの記述方法
リソースベースなルーティングの制限
resources/resourceのルーティングのアクションを一部を使用したい時に
『onlyオプション』・『exceptオプション』を指定します。Rails.application.routes.draw do # index・showアクションのみを使用 resources :users, only: [:index, :show] # index・show・edit・update・destroyアクション以外を使用 resources :books, except: [:index, :show, :edit, :update , :destroy] end$ rails routes Prefix Verb URI Pattern Controller#Action users GET /users(.:format) users#index user GET /users/:id(.:format) users#show books POST /books(.:format) books#create new_book GET /books/new(.:format) books#newリソースベースなルーティングに対して、アクションの追加
Railsの7つ基本的なアクション以外にも、『memberルーティング』・『collectionルーティング』でアクションを追加することができます。
memberルーティングとは
URIのパスに『:id』を含んだルーティング方法です。
memberルーティングRails.application.routes.draw do resources :photos do member do get 'preview' end end end$ rails routes Prefix Verb URI Pattern Controller#Action preview_photo GET /photos/:id/preview(.:format) photos#preview photos GET /photos(.:format) photos#indexcollectionルーティングとは
URIのパス『:id』を含まないルーティング方法です。
コードの記述方法は、memberルーティングと同じです。URIのパスの『:id』の有無で何が変わるのか
『id』とはアプリケーション内で登録したデータの管理番号です。
パスに『id』があるということは、『そのアクションを実行する時に、管理番号で必要なデータを特定している』ということになります。例えばRailsの7つの基本アクションで説明すると
index・new・createアクションにはパスに『id』がありません。
なぜかというと、一覧表示するために特定のデータはいらないですし、これから登録するデータには『id』がないからです。その逆に、show・edit・update・destroyアクションは
登録された特定のデータを表示したり、変更したり、削除したりするので
『id』がないとどのデータのことかわからないため、パスに『id』が入っています。ネストしたリソースのルーティング
ネストとは
『入れ子』という意味です。
ルーティングに親要素の中に入れ子構造で子要素を入れて記述することを表します。例)ネストしたリソースのルーティングRails.application.routes.draw do resources :books do resources :reviews end end今回の例だと、booksという親要素に、reviewsという子要素が入れ子構造になっています。
ルーティングへの効果
ネストしたルーティングすることによって、子要素のルーティングに親要素を関連付けることができます。
上記の例の場合だと、必ずreviews(子要素)はある特定のbook(親要素)に結びついていることになります。
reviews(子要素)のルーティングを確認するとこうなります。Prefix Verb URI Pattern Controller#Action book_reviews GET /books/:book_id/reviews(.:format) reviews#index POST /books/:book_id/reviews(.:format) reviews#create new_book_review GET /books/:book_id/reviews/new(.:format) reviews#new edit_book_review GET /books/:book_id/reviews/:id/edit(.:format) reviews#edit book_review GET /books/:book_id/reviews/:id(.:format) reviews#show PATCH /books/:book_id/reviews/:id(.:format) reviews#update PUT /books/:book_id/reviews/:id(.:format) reviews#update DELETE /books/:book_id/reviews/:id(.:format) reviews#destroy『Prefix』と『URI Pattern』の項目にネストの効果があります。
Prefix への効果
子要素の前に親要素が入ります。
book_reviews
やnew_book_review
などの親要素(book)が入ったPrefixになります。URI Pattern への効果
子要素の前に親要素と親要素のidが入ります。
/books/:book_id/reviews
という親要素(book)が入ったURI Patternになります。
/books/:book_id
の部分が特定の親要素を表すパスとなり
『子要素がどの親要素とつながりがあるか』が明示的に示されるようになります。以上になります。
- 投稿日:2020-08-05T15:58:14+09:00
syntax error [each do end のエラー]
”syntax error”と言い、
Rubyの繰り返し処理の
とあるものが抜けていると
エラーがでます!"each do"にたいしての
"end"がないのでエラーがおきました。”end”をつけると
ちゃんと機能します!
- 投稿日:2020-08-05T14:46:46+09:00
activerecord-importでUpdateする方法
微妙に書いてなかったので自分用にメモ
update_users = [] users.each do |user| user.name = "John" user.email = "test@mail.com" update_users << user end # ここのon_duplicate_key_updateに更新したい列名を渡す User.import update_users, on_duplicate_key_update: [:name, :email]GemのデフォルトはINSERTをする用途で
on_duplicate_key_update
オプションで列名を指定してあげることでキーが被ったときに指定した列が更新される(Upsertされる)という理解をした。なので元々あるユーザーだけを更新して渡せばUpdateだけされるという感じ。
ちなみにDBによってこのオプションの指定の仕方は違うらしい
https://github.com/zdennis/activerecord-import/#duplicate-key-update# MySQL version Book.import [book], on_duplicate_key_update: [:title] # PostgreSQL version Book.import [book], on_duplicate_key_update: {conflict_target: [:id], columns: [:title]}
- 投稿日:2020-08-05T14:42:21+09:00
rspec spec時のNameError: undefined local variable or method `config' for main:Objectの対処法
rails5中級チュートリアル中のテスト実行時に起こったエラー
エラー文
ターミナル#rsepc spec 実行時 NameError: undefined local variable or method `config' for main:Object原因と解決
rails_helper.rbへgemメソッドを使えるようにする記述の記述場所が誤っていた。
rails_helper.rb下記の記述をRSpec.configure do |config|の中に記述していなかったのが原因 config.include Devise::Test::IntegrationHelpers, type: :feature config.include FactoryBot::Syntax::Methods Capybara.javascript_driver = :poltergeist Capybara.server = :pumaこれでもう一度テストを実行すると...
ターミナルFinished in 0.17382 seconds (files took 5.23 seconds to load) 2 examples, 0 failures無事成功?
反省
今回のエラーで1時間ほど時間を食ってしまった。中級チュートリアルの記事をよく見返すと今回の原因が書いてあったので、以後チュートリアルを進める際は、細部まで目を通すことを心がける。
- 投稿日:2020-08-05T14:32:38+09:00
EC2インスタンスにrubyの実行環境導入中のエラー
エラー文
下記のサイトを参考にruby環境を構築していたところ・・・
https://qiita.com/naoki_mochizuki/items/814e0979217b1a25aa3e[naoki] sudo yum install \ #yumのインストール git make gcc-c++ patch \ #cとc++のコンパイラ、gitの差分をpatchファイルに変更 openssl-devel \ libyaml-devel libffi-devel libicu-devel \ libxml2 libxslt libxml2-devel libxslt-devel \ zlib-devel readline-devel \ mysql mysql-server mysql-devel \ ImageMagick ImageMagick-devel \ epel-release色々とエラーが発生
-bash: openssl-deve: コマンドが見つかりません -bash: libxml2: コマンドが見つかりません ※エラー文は消えてしまいましたがgitでも同じエラーが解決方法
完全に読み間違えていました。
指定のコマンドを実行する際は下記のように頭にsudo yum installを付けないといけないです。
これで全部コマンド通りました。気づくまで時間かかった・・・【sudo yum install】 + 【git make gcc-c++ patch】
- 投稿日:2020-08-05T12:49:04+09:00
rbenvでRuby自体のVersion管理をする
これは何?
Rubyのインストール時にVersion管理ツール経由でインストールするときのメモです。Ubuntuでのインストールで説明しています。
手順
rbenvをインストールする
$ sudo apt-get update $ cd $ git clone https://github.com/rbenv/rbenv.git ~/.rbenv $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc $ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build $ echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc $ source ~/.bashrcRubyをインストール
好みのVersionを指定してインストールして、そのVersionを使うように指定する。
$ rbenv install -l $ rbenv install 2.7.1 $ rbenv global 2.3.1bundlerをインストールする
$ gem install bundler $ rbenv rehashbundleのパッケージをインストールする
$ bundle install
- 投稿日:2020-08-05T11:54:59+09:00
PayPal Ruby SDKのSSL_connectエラーの解消方法
はじめに
最近、PayPal Ruby SDKでエラーが出るようになったが、その解決方法はGoogle検索しても日本語情報は無く、英語もほとんどHitしないのでメモ。ここ数日の出来事らしい。
SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate)
1.原因
原因はPayPal側にある。PayPal Ruby SDK GemはSSL証明書を内部にPackageしてしまっており、この証明書が最近Removeになった事が原因。PayPalがどうして証明書をGemに入れ込むような作り方をしたのかは分からないが、SDKをハックすれば解消できる。
2.解決方法
SDK内部の証明書にまだ有効期限内のPEMを追記してRailsサーバーを再起動すれば解消する。
3.解決手順
(1) PEMをダウンロード
参考記事でPayPalが発表しているPEMをダウンロードする。私はDigiCert High Assurance EV Root CAを使ったが、どれでも良いと思う。
DigiCert High Assurance EV Root CAの入手先
Download here: https://www.digicert.com/digicert-root-certificates.htm
ここからDigiCert High Assurance EV Root CAのPEMをダウンロードする。
(2) SDK内のpaypal.crtの場所を検索
MacやUnixなら
find
コマンドで探す。Railsアプリの場合はアプリケーションのRootディレクトリ以下を探せば良いだろう。Production環境ではRubyが入っている場所、分からなければ sudo で / から全検索(find / -name paypal.crt -print
)しても良い。私のサーバーはAWSなので以下のように
~/
以下を検索した。rails_root[ec2-user@awsome_server ~]$ find ./ -name paypal.crt -print 2>/dev/null ./.rbenv/versions/2.7.0/lib/ruby/gems/2.7.0/gems/paypal-sdk-rest-1.7.4/data/paypal.crt(3) PEMをpaypal.crtに追記
ダウンロードしておいたPEMファイルの中身を確認。
ローカルのMacのターミナル$ cat DigiCertHighAssuranceEVRootCA.crt.pem -----BEGIN CERTIFICATE----- MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL 途中省略 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep +OkuE6N36B9K -----END CERTIFICATE-----findで見つけたpaypal.crtを編集する。以下の172行目〜196行目が追加した部分である。単純に一番下に追加しただけであるが、======が必要なのと、正確な名称(DigiCert High Assurance EV Root CA)で区切ることに注意する。
railsサーバーで実行[ec2-user@awsome_server ~]$ sudo vi paypal.crt 168 CEHwxWsKzH4PIRnN5GfcX6kb5sroc50i2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWX 169 bj9T/UWZYB2oK0z5XqcJ2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/ 170 D/xwzoiQ 171 -----END CERTIFICATE----- 172 DigiCert High Assurance EV Root CA 173 ======================================================= 174 -----BEGIN CERTIFICATE----- 175 MIIDxTCCAq2gAwIBAgIQAqxcJmoLQJuPC3nyrkYldzANBgkqhkiG9w0BAQUFADBs 176 MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3 177 d3cuZGlnaWNlcnQuY29tMSswKQYDVQQDEyJEaWdpQ2VydCBIaWdoIEFzc3VyYW5j 178 ZSBFViBSb290IENBMB4XDTA2MTExMDAwMDAwMFoXDTMxMTExMDAwMDAwMFowbDEL 179 MAkGA1UEBhMCVVMxFTATBgNVBAoTDERpZ2lDZXJ0IEluYzEZMBcGA1UECxMQd3d3 180 LmRpZ2ljZXJ0LmNvbTErMCkGA1UEAxMiRGlnaUNlcnQgSGlnaCBBc3N1cmFuY2Ug 途中省略 191 eM7b41N5cdblIZQB2lWHmiRk9opmzN6cN82oNLFpmyPInngiK3BD41VHMWEZ71jF 192 hS9OMPagMRYjyOfiZRYzy78aG6A9+MpeizGLYAiJLQwGXFK3xPkKmNEVX58Svnw2 193 Yzi9RKR/5CYrCsSXaQ3pjOLAEFe4yHYSkVXySGnYvCoCWw9E1CAx2/S6cCZdkGCe 194 vEsXCS+0yx5DaMkHJ8HSXPfqIbloEpw8nL+e/IBcm2PN7EeqJSdnoDfzAIJ9VNep 195 +OkuE6N36B9K 196 -----END CERTIFICATE-----(4) Railsサーバー再起動
環境によるが、私の場合はAWSでsystemctlで再起動できるので、実行。
AWS[ec2-user@awsome_server ~]$ sudo systemctl restart railsこれでSSLエラーは出なくなり、正常にAPIコールできるようになった。
参考記事
- (PayPal) Remove Support of Verisign G5 Root Certificate
- Stackoverflow -PayPal SDK got SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate)
- Stackoverflow -OpenSSL::SSL::SSLError: SSL_connect returned=1 errno=0 state=error: certificate verify failed (unable to get local issuer certificate)
- 投稿日:2020-08-05T10:34:47+09:00
【解決】ActiveModel::UnknownAttributeError: unknown attribute 'foreign_type' for PaperTrail::VersionAssociation の対処法
起こったこと
rails db:migrate
したら以下のようなエラーを吐いた。
エラー文を読むと、「VersionAssociation
テーブルにforeign_type
カラムがない!」と怒られている。ActiveModel::UnknownAttributeError: unknown attribute 'foreign_type' for PaperTrail::VersionAssociation原因
paper_trailというgemをアップデートしたことで発生。
公式リポジトリのCHANGELOG.mdを見るとforeign_type
に関する記述を発見。。How to Upgrade from v1.0.0 or earlier
Run rails g paper_trail_association_tracking:add_foreign_type_to_version_associations and then migrate your database.カラムを追加するマイグレーションファイルを作成してから
rails db:migrate
すればよさそう。解決方法
terminal# カラムを追加するマイグレーションファイルを作成 rails g paper_trail_association_tracking:add_foreign_type_to_version_associations # 作成したマイグレーションファイルを適応 rails db:migrate参考
- 投稿日:2020-08-05T10:34:47+09:00
ActiveModel::UnknownAttributeError: unknown attribute 'foreign_type' for PaperTrail::VersionAssociation のエラー対応
起こったこと
rails db:migrate
したら以下のようなエラーを吐いた。
エラー文を読むと、「VersionAssociation
テーブルにforeign_type
カラムがない!」と怒られている。ActiveModel::UnknownAttributeError: unknown attribute 'foreign_type' for PaperTrail::VersionAssociation原因
paper_trailというgemをアップデートしたことで発生。
公式リポジトリのCHANGELOG.mdを見るとforeign_type
に関する記述を発見。。How to Upgrade from v1.0.0 or earlier
Run rails g paper_trail_association_tracking:add_foreign_type_to_version_associations and then migrate your database.カラムを追加するマイグレーションファイルを作成してから
rails db:migrate
すればよさそう。解決方法
terminal# カラムを追加するマイグレーションファイルを作成 rails g paper_trail_association_tracking:add_foreign_type_to_version_associations # 作成したマイグレーションファイルを適応 rails db:migrate参考
- 投稿日:2020-08-05T09:15:24+09:00
Sinatraで家族用todoリストを作る
はじめに
@kirinri さんが 素敵な記事 - Qiita を投稿されているので、それに乗っかってみる
完成画面
工夫した点
ユーザを削除した際、当該ユーザのTodoを削除
main.rbpost '/destroy_user' do Todos.where('users_id = ?', params[:users_id]).destroy_all Users.find(params[:users_id]).destroy redirect to('/') end
activerecord
ってSQLを書かなくてもいいので素敵です。アイテムの角を丸くする
style.css.user_btn { height: 28px; background-color: #FFAD90; border-style: none; -moz-border-radius: 5px; -webkit-border-radius: 5px; border-radius: 5px; }後半の3行が丸くする処理です
追記
ユーザを削除した場合、リロードされないのでドロップダウンリストに削除したユーザが残ってしまいます。
そのユーザでリストに追加すると例外が発生します。
main.rbpost '/create_todo' do begin Todos.create(body: params[:body],users_id: params[:users_id]) rescue => e end redirect to('/') end例外処理を追加しましたが、スルーしているだけですので褒められたものではないと思います。
まとめ
- @kirinri さんありがとうございました
- Sinatra でtodoリストを作った
- ActiveRecord が便利すぎる
参照したサイト
Sinatraで家族用todoリストを作る
- 投稿日:2020-08-05T09:05:44+09:00
アルファベットを26進数に変換+配列の長さについて
- 投稿日:2020-08-05T01:35:35+09:00
haml ヘッダーロゴの挿入 【備忘録】
- 投稿日:2020-08-05T01:33:26+09:00
テーブル作成とカラムを追加する
テーブルにカラムを追加する
データーベースとは?
データを保存するもの。
例えば家のようなもの。ただ家に全てのデータを一気に入れると、何がどこにあるか探すの大変です。テーブルとは?
データの種類ごとの保存場所。
家でいうなら、部屋。
データの種類ごとに関係する場所に入れると分かりやすく管理しやすいです。
それをテーブルといいます。テーブルの作り方
家の中に部屋があって部屋ごとに名前があるようにデータベース内のテーブルにも名前をつけます。
データベースはmodelとやり取りしてデータを取り出したり保存したりする。門番みたいなもの。
モデルを作る
※作りたいアプリのディレクトリにいること!
% rails g model モデル名モデルに関連するファイルが作成される。
invoke active_record create db/migrate/20200315054113_create_posts.rb create app/models/post.rb invoke test_unit create test/models/post_test.rb create test/fixtures/posts.ymlcreateで生成成功!
モデルファイルは app/models/post.rbにある。
テーブルを作成する
% rails g model モデル名をした時にモデルに関係あるファイルが複数作成された。
その中の1つにdb/migrate/20200315054113_create_posts.rb(マイグレーションファイル)が作られた。
マイグレーションファイルでテーブルの中身を作ります。
テーブルは部屋と例えました。
さらに、その中で整理してデータを保存するために型とカラム名を作ります。部屋の中が乱雑だとまた取り出しにくいし保存もしずらいという事です。
型
どんなデータが入るのかを示してくれるので分かりやすくなります。
integer 数値 金額、回数
string 文字(短文) ユーザー名、メールアドレス
text 文字(長文) 投稿文、説明文
datetime 日付と時刻 作成日時、更新日時カラム名
その名の通り名前です。自分で決めれる。
さて、マイグレーションファイルにカラム名と型を書きます。
class CreatePosts < ActiveRecord::Migration[6.0] def change create_table :posts do |t| t.text :memo t.timestamps end end endt.カラム型 :カラム名 と記入
何個もかけます。追加したいカラムを記述します。
それでは、データベースにPostテーブルと。そのテーブルの中にこのカラムを作ってねと言う指令を出します。
マイグレーションファイルに書いた内容を反映する。
% rails db:migrate ※作りたいアプリのディレクトリにいること!
この流れがデータベース作成の流れの基本です。
1.モデルを作成
2.マイグレーションファイルにカラムの型とカラム名記述
3.% rails db:migrate
- 投稿日:2020-08-05T01:30:01+09:00
Google ColabでRubyを使う
Google Colab で Rubyを動かしてみた が2020年7月現在そのままでは動かなくなっていたので、Juliaの例を参考に試行錯誤してやってみたら上手くいったので紹介します。
簡単実行編
1. ファイルのダウンロード
このファイルを右クリックして「リンク先を保存」するなどして、パソコンにダウンロードします。
2. ノートブックのアップロード
https://colab.research.google.com/ を開き、上記からダウンロードしたファイルを「アップロード」(初めてGoogle Collaboratoryを開いた場合は「ファイル」→「ノートブックをアップロード」)します。
3. Rubyと必要ソフトのインストール
あらかじめコードが入力されたセルが2つあるノートブックが開きます。いちばん上のセルをクリックして、そのままShift+Enter(または右三角印のボタン)を押して実行します。すこし時間がかかります。
下のほうにランタイム「ruby」は認識されていません。デフォルトの「python3」に接続します
というメッセージが出ますが無視します。4. 追加のgemのインストール
2個めのセルに移って、インストールしたいgemの行だけを残す編集を行った後で、Shift+Enter(または右三角印のボタン)を押して実行します。
5. ランタイムをrubyに切り替える
「ランタイム」→「ランタイムのタイプを変更」を押します。すると、「ランタイムのタイプ」として「ruby 2.5.1」が選択された状態になった「ノートブックの設定」ウインドウが出ます。「ランタイムのタイプ」として「ruby 2.5.1」が選択されていることを確認して「保存」を押します。(もし選択されていなかったら、一覧から「ruby 2.5.1」を選んでから保存。)
6. Rubyコードを実行
これで、Rubyコードを実行する環境が整いました。
たとえばRUBY_VERSION
と入力してShift+Enterを押すと、"2.5.1"
と表示されるはずです。
手動操作編
上記を手動で行う方法です。Google側の環境が変わった場合に備えて記述します。
1. Google Colaboratoryで新規ノートブックを作成
https://colab.research.google.com/ を開き、「ノートブックを新規作成」(初めてGoogle Collaboratoryを開いた場合は「ファイル」→「ノートブックを新規作成」)を押して新規のノートブックを作成します。
2. そのままipynb形式でダウンロード
何も入力していないまっさらな状態のノートブックを、「ファイル」→「ipynbをダウンロード」でダウンロードします。
3. ダウンロードしたファイルをパソコン上で編集する
この項はパソコン上のテキストエディタで行います。
ファイル内の"kernelspec"
から始まる以下の部分を探します。"kernelspec": { "name": "python3", "display_name": "Python 3" }上記の
"python3"
および"Python 3"
の所を、以下のようにRuby用に書き換えます。"kernelspec": { "name": "ruby", "display_name": "ruby 2.5.1" }書き換えたら、保存します。
4. 書き換えたノートブックをアップロード
ウェブブラウザのGoogle Colaboratoryの「ファイル」→「ノートブックをアップロード」から、先ほど書き換えたファイルをアップロードします。
5. Rubyと必要ソフトのインストール
以下をGoogle Collaboratoryのセル(入力する所)にそのままコピーペーストします。
!apt install libtool libffi-dev ruby-full make !apt install libzmq3-dev libczmq-dev !gem install ffi-rzmq !gem install specific_install !gem specific_install https://github.com/SciRuby/iruby !iruby registerその後、Shift+Enterを押して、実行します。すこし時間がかかります。
下のほうにランタイム「ruby」は認識されていません。デフォルトの「python3」に接続します
というメッセージが出ますが無視します。6. 追加のgemのインストール
必要に応じて、追加のgemをインストールします。以下をコピーペーストしてから、インストールしたいgemの行だけ残します。その後、Shift+Enterを押して実行します。
!gem install awesome_print !gem install pry !gem specific_install https://github.com/SciRuby/daru !gem specific_install https://github.com/SciRuby/daru-view !gem install numo-narray !gem install rumale !gem install bio7. ランタイムをrubyに切り替える
簡単実行編の「5. ランタイムをrubyに切り替える」と同じ操作を行います。
8. Rubyコードを実行
これで、Rubyコードを実行する環境が整いました。
参考資料
Google Colab で Rubyを動かしてみた -- この記事が無ければ本記事は実現できませんでした。aptのインストールパッケージやirubyのインストール方法はこの記事をベースにして一部変更しました。
Google ColabでJuliaを使う:元々あるノートブックを使う -- ipynbのjsonを書き換えアップロード後に言語をインストールしてランタイムを切り替える手法を参考にしました。