20200805のRubyに関する記事は18件です。

Rails herokuにデプロイ後にAPIキーが見当たらなかった時の解決方法

実装した機能

gem geocoder を使って入力した住所から緯度、経度を取得。
Google API Keyを取得してアプリ上に地図表示。

発生した問題

開発環境では問題なく動作していたがデプロイ後に本番環境で
動作チェックすると入力した住所に対して地図が表示されず何も返してくれなかった。

推測してみた

コンソールをチェックするとNo ApikeysInvalidkeyと出ていたので、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] 環境変数の操作

こちらの記事を参考にさせていただきherokuに環境変数をセット。

無事解決できました!!!

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

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.rb
daemonize

って追記するんだ!
これで

rails s -e production -d

では起動できないままだけど

rails s -e production 

これでデーモン化されるので解決だよ!

これじゃローカルでもデーモン化されて不便だろって人は

config/puma.rb
if Rails.env == 'production'
  daemonize
end

って書こうね!誰でも思いつく回避策だね!知ったげに書いてごめんね!

原因

完全に調べきったわけじゃないですが、私がネットサーファーになってgoogleの海を潜った結果、どうやら pumaで"rails s -d" でデーモン化すると puma.rbが読み込まれないみたいです。
rails s -e production -d で起動した際にNginxのエラーログにpuma.rbで設定しているsocketで接続できなかったよ!って記載されていますので、多分あってるんでないかなと思います。

コイツはマズイぜ!という点があればご指摘ください!

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

【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.rb
default_scope -> { order(created_at: :desc) }

今回も、Feedモデルというデータの並び替え設定をした。
この記法は、ラムダ関数というもので、特殊である。

こうすることで、作成した日時(created_at)の降順で、並び替えするようにデフォルト設定を行うことができる。

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

[ruby]ドリルアウトプット

内容

クラスとインスタンスの概念を用いたコードの作成
image.png
上記のコードに追加を行い、以下の出力結果を得られるようにしてください。ただし、クラスとインスタンスを使用するものとします。
image.png

実装

image.png
まず、3行目〜7行目のinitializeメソッドで宣言されたインスタンス変数に(阿部、Rubyの素晴らしさについて、Awesome Ruby!)を代入したいので、9行目〜19行目でインスタンス変数の値を返すためのインスタンスメソッドをそれぞれ定義します。
そして、21行目でArticleクラスのインスタンスを生成し、変数articleに代入します。
その際に実引数として(阿部、Rubyの素晴らしさについて、Awesome Ruby!)を仮引数に渡してあげます。

そうすると何と不思議全て呼び出すことに成功しましたーーーー✨

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

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.rb
  Rails.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#index

collectionルーティングとは

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_reviewsnew_book_reviewなどの親要素(book)が入ったPrefixになります。

URI Pattern への効果

子要素の前に親要素と親要素のidが入ります。
/books/:book_id/reviewsという親要素(book)が入ったURI Patternになります。
/books/:book_idの部分が特定の親要素を表すパスとなり
『子要素がどの親要素とつながりがあるか』が明示的に示されるようになります。

以上になります。

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

syntax error [each do end のエラー]

”syntax error”と言い、
Rubyの繰り返し処理の
とあるものが抜けていると
エラーがでます!

"each do"にたいしての
"end"がないのでエラーがおきました。

”end”をつけると
ちゃんと機能します!

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

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

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時間ほど時間を食ってしまった。中級チュートリアルの記事をよく見返すと今回の原因が書いてあったので、以後チュートリアルを進める際は、細部まで目を通すことを心がける。

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

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

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 ~/.bashrc

Rubyをインストール

好みのVersionを指定してインストールして、そのVersionを使うように指定する。

$ rbenv install -l
$ rbenv install 2.7.1
$ rbenv global 2.3.1

bundlerをインストールする

$ gem install bundler
$ rbenv rehash

bundleのパッケージをインストールする

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

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をダウンロードする。

スクリーンショット 2020-08-04 午後10.29.53.png

(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コールできるようになった。

参考記事

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

【解決】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

参考

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

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

参考

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

Sinatraで家族用todoリストを作る

はじめに

@kirinri さんが 素敵な記事 - Qiita を投稿されているので、それに乗っかってみる

 完成画面

20200805.png

工夫した点

ユーザを削除した際、当該ユーザのTodoを削除

main.rb
post '/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行が丸くする処理です

追記

ユーザを削除した場合、リロードされないのでドロップダウンリストに削除したユーザが残ってしまいます。
20200806.png
そのユーザでリストに追加すると例外が発生します。
20200806error.png

main.rb
post '/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リストを作る

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

アルファベットを26進数に変換+配列の長さについて

#paizaの問題を解く時に参考になったものを載せます

アルファベットを26進数に変換(1~26)

S="abcdefghijklmnopqrstuvwxyz"
S.index(x)+1
Sで26番目までの文字列にして、実際のアルファベットがその何番目に当たるかで数字に変換してます。
(もっといいやり方ありそうです。。。。)

配列の長さ

x = [1,2,3,4,5]
x.length (=5)
(x.length -1) (=4)
一個短い長さとかでもでも使えます。

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

haml ヘッダーロゴの挿入 【備忘録】

hamlでのマークアップにおいて、画像の挿入方法について、備忘録として記述する。

画像ファイルをimagesファイル下に追加

halmにimage_タグメソッドを記述

.header__left
   = link_to "#", class: "クラス名" do
     = image_tag 'image以下のパス', alt: '', height: , width: , class:
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

テーブル作成とカラムを追加する

テーブルにカラムを追加する

データーベースとは?

データを保存するもの。
例えば家のようなもの。ただ家に全てのデータを一気に入れると、何がどこにあるか探すの大変です。

テーブルとは?

データの種類ごとの保存場所。 
家でいうなら、部屋。
データの種類ごとに関係する場所に入れると分かりやすく管理しやすいです。
それをテーブルといいます。

テーブルの作り方

家の中に部屋があって部屋ごとに名前があるようにデータベース内のテーブルにも名前をつけます。

データベースは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.yml

createで生成成功!

モデルファイルは 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
end

t.カラム型 :カラム名  と記入

何個もかけます。追加したいカラムを記述します。

それでは、データベースにPostテーブルと。そのテーブルの中にこのカラムを作ってねと言う指令を出します。

マイグレーションファイルに書いた内容を反映する。

% rails db:migrate  ※作りたいアプリのディレクトリにいること!

この流れがデータベース作成の流れの基本です。

1.モデルを作成
2.マイグレーションファイルにカラムの型とカラム名記述
3.% rails db:migrate

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

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 bio

7. ランタイムをrubyに切り替える

簡単実行編の「5. ランタイムをrubyに切り替える」と同じ操作を行います。

8. Rubyコードを実行

これで、Rubyコードを実行する環境が整いました。

参考資料

  1. Google Colab で Rubyを動かしてみた -- この記事が無ければ本記事は実現できませんでした。aptのインストールパッケージやirubyのインストール方法はこの記事をベースにして一部変更しました。

  2. Google ColabでJuliaを使う:元々あるノートブックを使う -- ipynbのjsonを書き換えアップロード後に言語をインストールしてランタイムを切り替える手法を参考にしました。

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