20200213のRailsに関する記事は11件です。

超初学者向け RailsのMVCについて

Ruby on Railsを学ぼうと思っている方、学び始めの方にMVCってこういう感じのものなんだ、と雰囲気だけでもわかってもらえると良いなと思い投稿します。

MVCとは

MVCとはModel(モデル), View(ビュー), Controller(コントローラー)の3つを指しています。

MVCの役割

  • Model(モデル)
    Modelとはデータベース(データを保存しているところ)からデータを取り出したり、データベースに新しいデータを保存するといったやりとりをするものです。
  • View(ビュー)
    Viewとは普段みなさんが目にするwebサイト等での見た目の部分、つまり画面です。 Viewファイルを編集することによって画面に何を表示するか、なにを表示させないかを記述します。
  • Controller(コントローラー)
    ControllerとはModelとViewの中間でやりとりをするものです。ViewのURLによってどのようなデータを取り出すか、保存するかを判断しています。(ルーティング)

まとめ

ModelからControllerにデータを受け渡す
ControllerからViewにデータを渡す。
Viewで渡されたデータを表示する。
という認識で良いかと思います。

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

Mysql2がbundle installできない対処法 (rails)

はじめに

みなさん、お疲れマンボウ!!!
これが初投稿になります。
最近、プログラミング始めた、新参者ですのでお手柔らかにお願います。
今回は、railsでbundle installした時、bundle installできないという、
まさかのエラーに遭遇しましたので、備忘録として、投稿します。

環境

(ruby) 2.5.1ver
(rails) 5.1.7ver
(OS) macOS mojave
(bundler) 2.0.2ver

コード

$bundle install

The dependency tzinfo-data (>= 0) will be unused by any of the platforms Bundler is installing for. Bundler is installing for ruby but the dependency is only for x86-mingw32, x86-mswin32, x64-mingw32, java. To add those platforms to the bundle, run `bundle lock --add-platform x86-mingw32 x86-mswin32 x64-mingw32 java`.
Fetching gem metadata from https://rubygems.org/............
Fetching gem metadata from https://rubygems.org/.
...
...
... (インストールのログが多数出てきます。)

Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory: /Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.4.10/ext/mysql2
/Users/ユーザー名/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20200213-92138-5up80x.rb extconf.rb --with-cppflags=-I/usr/local/opt/openssl@1.1/include
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... no
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
checking for rb_big_cmp()... yes
-----
Using mysql_config at /usr/local/opt/mysql@5.6/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... no
checking for MYSQL_OPT_SSL_ENFORCE in mysql.h... no
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/opt/mysql@5.6/lib
-----
creating Makefile

current directory: /Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.4.10/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.4.10/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
result.c:326:40: warning: incompatible pointer types assigning to 'my_bool *' (aka 'char *') from 'bool *' [-Wincompatible-pointer-types]
    wrapper->result_buffers[i].is_null = &wrapper->is_null[i];
                                       ^ ~~~~~~~~~~~~~~~~~~~~
result.c:328:40: warning: incompatible pointer types assigning to 'my_bool *' (aka 'char *') from 'bool *' [-Wincompatible-pointer-types]
    wrapper->result_buffers[i].error   = &wrapper->error[i];
                                       ^ ~~~~~~~~~~~~~~~~~~
2 warnings generated.
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/ユーザー名/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.4.10 for inspection.
Results logged to /Users/mitsunaga1218/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-darwin-18/2.5.0/mysql2-0.4.10/gem_make.out

An error occurred while installing mysql2 (0.4.10), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.4.10' --source 'https://rubygems.org/'` succeeds before bundling.

正直、これ見て全く理解できませんでした。笑
とりあえず、エラー文だけをピックアップして、自分なりに解釈したところ、
最後あたりのコード

Make sure that `gem install mysql2 -v '0.4.10' --source 'https://rubygems.org/'` succeeds before bundling.

の部分に着目しました。
直訳すると、「バンドル前にgem install mysql2 -v '0.4.10'に成功していることを確認してください。」
って書いてます。
なので、mysql2 '0.4.10'をインストールしてみました。

sudo gem install mysql2 -v '0.4.10' --source 'https://rubygems.org/'

したところ、またよくわからないエラーが...
うーむ、困ったものです。頭打ち状態になったので、同じエラーの記事がないか調べました。

解決方法

同じエラーが出ている記事が多数ありましたので、自分は下記の記事を参考にしました。

【Rails】MySQL2がbundle installできない時の対応方法
https://qiita.com/fukuda_fu/items/463a39406ce713396403

難しすぎてよくわかりませんが、とりあえず、OpenSSL(インターネットで情報をやり取りする際に暗号化通信に用いられるライブラリ)の情報の中から、LDFLAGSとCPPFLAGSの情報を取得し、その情報をbundlerの構成オプションに追加してあげることで、エラーが解決しました!!

やったこと

1.$ brew info openssl
2.$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"
3.$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"

$ brew info openssl
openssl@1.1: stable 1.1.1d (bottled) [keg-only]
Cryptography and SSL/TLS Toolkit
https://openssl.org/
/usr/local/Cellar/openssl@1.1/1.1.1d (7,983 files, 17.9MB)
  Poured from bottle on 2019-11-07 at 14:52:28
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/openssl@1.1.rb
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl@1.1/certs

and run
  /usr/local/opt/openssl@1.1/bin/c_rehash

openssl@1.1 is keg-only, which means it was not symlinked into /usr/local,
because openssl/libressl is provided by macOS so don't link an incompatible version.

If you need to have openssl@1.1 first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile

For compilers to find openssl@1.1 you may need to set:
  export LDFLAGS="-L/usr/local/opt/openssl@1.1/lib"
  export CPPFLAGS="-I/usr/local/opt/openssl@1.1/include"

For pkg-config to find openssl@1.1 you may need to set:
  export PKG_CONFIG_PATH="/usr/local/opt/openssl@1.1/lib/pkgconfig"

続いて、

$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl@1.1/include"
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl@1.1/lib"

最後に、

$ bundle install

以上です!!!
qiita様様です❤️

最後に

OpenSSLにしろ、LDFLAGSにしろ、正直理解できてませんので、これから勉強します。間違っている部分あった場合は、ご教授願います。ということで、本日もあざした。

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

【Rails】パーシャルまとめ

パーシャルを使う目的

viewの一部を別ファイルに切り出し、可読性と再利用性を上げる。

基本の使い方

・パーシャルファイルの名前は_から始まる(_graph.html.erbなど)
・パーシャルが同じディレクトリにある時はrender '{ファイル名}'で呼びだす。(拡張子不要)

<%= render 'graph' %>

・違うディレクトリの時はrender '{ディレクトリ名/ファイル名}'で呼びだす。

<%= render 'shared/error_messages' %>

変数を渡す

<%= render partial: 'graph', locals: { id: 1, name: '棒グラフ'} %>
または
<%= render 'graph', id: 1, name: '棒グラフ' %>
_graph.html.erb
ID:<%= id %>
名前:<%= name %>

collectionオプション(応用)

collectionオプションに複数形のインスタンス変数を渡すと、渡されたインスタンスの要素分そのテンプレートを繰り返し表示します。

<%= render partial: 'book_detail', collection: @books, as: 'book' %>

この場合、
@booksに格納されているインスタンス分だけ_book_detail.html.erbが繰り返し表示されます。
・呼び出されたパーシャル内ではbookという名前のインスタンスを利用することができます。
book_counterという名前のindexの変数が自動で作られます。(0から始まる)

Railsのpartialでcollectionを渡すときにはindexの変数が自動的に作られる

参考

【Rails基礎】ややこしい部分テンプレートの省略形について簡単にまとめてみた
【Rails】部分テンプレートの使い方を徹底解説!

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

gitignoreとvendor/bundle

1. gitignoreについて知る

gitignoreとは

gitignoreとは以下のファイルです。
gitの管理下から除外したいファイルを書きます。

helloというディレクトリ中身全てを除外したい場合は

/hello/
とするか、
hello/
とするか
hello/*

Screenshot from Gyazo

gitignoreの注意点

gitignoreはgitignoreに記載後、ファイルが次に作成された時にignoreされる。

つまり、元からあったファイルはgitignoreに記載しても除外されない

対処法

実際のファイルは残しながら、gitから削除する、削除したというコミットをする。

git rm --cached -r ファイル・フォルダまでのパス

つまり
git rm --cached -r uploads/images/*などのコマンドを実行する

2. vendor/bundleについて知る

vendor/bundleとは

bundle installするときのオプションでよく使われる

bundle install --path vendor/bundle

bundle installで導入されるgemが全て、アプリのディレクトリの中に保存されます。
バージョンを固定したい場合や本番環境なので、ごくごく稀に使用される。

vendor/bundleする弊害

gitignoreしていないと、gitに大量の変更が上がってしまう。

vendor/bundleの対処法

ファイルを消して、bundle installする。
ではダメです。

.bundleフォルダにあるconfigファイルにvendor/bundleのパスが残されています。
これを削除する必要があります。

vi .bundle/config

BUNDLE_PATH: "vendor/bundle"の行を消す

やるべきことをまとめると、

  • vendor/bundleのディレクトリを削除
  • .bundle/configの修正
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails の設計を見直す

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

【使用技術編】未経験からWeb系自社開発企業に転職するためにどのようなポートフォリオを作ったか。

こんにちは。
先日30歳未経験から独学4ヶ月でバックエンドエンジニアとしてWeb系自社開発企業へ転職するまでのロードマップという記事を投稿しました。

そちらではポートフォリオの内容について詳しくは触れなかったので、こちらでお話しできたらなと思います。

私がどんなポートフォリオで就活に臨んだか
という内容になります。
前回の記事と被る部分も多くありますがご容赦くださいまし。

前置き

本記事はプログラミング初心者を対象にしたものなので、理解しやすいように噛み砕いて文章を作成しています。
多少語弊のある内容もあるため現役プログラマーの方の閲覧時は生暖かい目で見てください(笑)

前提

私が作成したのは規模の小さい自社開発のベンチャー企業に就職するためのポートフォリオです。
評価の仕方は「会社の規模・形態によって変わる」というのが私の見解。
入りたい会社によって見るポイントは変わり、それに合わせた成果物を提出しないと高い評価は得られないと思います。

たとえばフロント・バック・インフラの各分野でそれぞれ部署から分かれているような大きめの会社の場合、自分がジョインする部署以外の技術は選考でスルーされることもあります。
だったら一つの分野に特化したポートフォリオのほうが良い場合もあるということですね。

もちろん全部できればいいんですが、時間は限られているのでしっかり見定めて上手に勉強しましょう!

ポートフォリオとはなんのために作るのか。

これを意識していないと、成果物のアピールポイントがブレてしまうのでしっかり固めておきましょう。
私が特に意識したことは以下2点です。
- 自身の自走力の証明
- 自分がどの分野に興味があるのか

重要なのは現時点での技術力の証明ではないと考えています。
多くの企業は未経験者に高い技術力自体を求めているわけではなく、その技術を自力で学んだ自走力を求めているのではないかという考えですね!
入社してからちゃんと会社の使用技術にキャッチアップし成長してくれるかどうかを見ているのでは無いだろうか?と思い取り組んでいました。

どんなポートフォリオを作ったか

  • 基本的な機能を備えた記事投稿サービス
  • Youtubeの動画を埋め込める仕様にした
  • 本番環境はAWS
  • 開発環境にDockerを導入
  • CIツールにCircleCIを導入
  • 自分なりに見やすいUIを意識した
  • 誰でもすぐに使える仕様にした

Ruby on Railsを使用し基本的な機能を搭載

私のポートフォリオに搭載した機能は以下です。

  • 記事投稿・編集・削除
  • 記事検索
  • ユーザー登録・編集・削除
  • 画像投稿
  • Youtube動画埋め込み機能
  • ページネーション機能

ページネーションと検索機能、動画埋め込み機能の3つ以外は全てProgateで学べる技術です。
単体テストのためにRspecも導入しました。

Railsのバージョンは5系がいいかなと思います。

最新のバージョンは6系ですが、リリースされて間もない(2020年2月現在)ので選考を受ける企業とのマッチ度が低いかなと。
今はRails4系か5系を使っている企業が多いという話を先輩から聞きました。
またリリース間もないということでネット上に技術的な情報が少なく、英語の記事や公式リファレンスを読むことになります。厳しい。

MySQL8は使わない方が良いと思います

MySQL8からは認証プラグインというものが変わっているのが初学者にとっては厄介・・・。
僕はいちいちそれを過去の認証プラグインに変える動作をいれないとエラーが出る〜なんて時期がありました。

もともとMySQL8を前提にしたDBの学習をしていれば良いのですが、ネット上に出回っている情報が少なめなのでMySQL5.7とかの方がエラーにぶつかったとき対処しやすいです。
※DB関連のエラーは本番環境やDocker、CircleCIなど環境構築の時に発生しやすく、そういったインフラ部分の学習の妨げになりかねないです。

最初の開発環境はAWS cloud9を使うのがおすすめ。

自分のパソコン上で開発環境を構築しようとすると、最初は「何をインストールすればええのん?」ということになります。(そもそも当時は「開発環境構築ってなんだ?」って思ってましたw)
Progateなどの学習サイトを終えてポートフォリオ作るよ!ってなったときにここでつまづくと一気にモチベーションが下がって挫けそうになります!
しかも、後々Dockerを学習すれば環境構築はDockerで行うので、今骨を折って頑張る部分ではないと思います。
AWS https://aws.amazon.com/jp/
アカウントを作った後にコンソールからCloud9に飛び、好みの開発環境を選ぶだけです。

ここまでで思ったことは以下

  • ユーザー登録機能にはGemの"device"を使えばよかった。
  • Twitter認証ログインやAPIを使用した機能を導入すればよかった。

特に2つ目のAPIについてです。
昨今はAPIの使用が当たり前になっているので、APIの仕組みや必須となってくるHTTP通信について学んだ方が苦労は少なかったと思います。

以前書いたようにポートフォリオはチュートリアルに毛が生えた程度のものでは高い評価が得られません。
その辺りは話題のテック系YouTuberさんもわかりやすく解説してくださっている動画があるのでぜひ調べてみてください(許可を得てないのでリンクはしてません)

そこでどのように+αのアピールポイントをつけるのか。
バックエンドの領域における+αという形でいうと、API導入は良いチョイスだと思います。
学習ハードルが低く目につきやすい機能としてTwitte認証ログインもオススメです。

え?機能少なくない!?と感じたかと思います。

私は+αのアピールポイントをバックエンドの領域では作りませんでした。
もちろん作りたかったのですが、仕事も忙しく作業の時間は限られていたからです。

私はバックエンドだけでなくインフラの領域にも興味を持っていたため、そちらで+αのアピールポイントを作りました。

ポイント1:本番環境はAWSへデプロイ

これは必須だと思っています。
導入の難易度が低いことからHerokuを使用する人も多いと聞きますが、それは実践を全く意識していないと自ら言っているも同然というのが個人的な意見。

最初はElastic Beanstalk を使用するのがベストでしょう!

インフラの領域へ足を踏み入れることになるため学習ハードルは高いです。
最初は多くの作業をAWSが自動で行ってくれるElastic Beanstalk(EB)でデプロイを行ってみて、それからVPCやEC2、RDSなどの勉強をするとモチベーションも保てて良いと思います!(๑•̀д•́๑)
EBではGUI(コマンドラインではなくてブラウザ上)でポチポチ選択して環境が作れますし、DBもポチポチして勝手に作ってくれます。
デプロイもGitHubからZipでDLしてポイってするだけなので簡単。初心者には絶対おすすめです。

ポイント2:開発環境にDockerを導入

注目度が高く、今では当たり前に現場で使われている技術のため導入しました。
個人的にはかなり重要なポイントだと思います。

なぜならこれも実践を意識していることをアピールできるからです。
※詳しくは他に解説している記事やサイトを参照していただければと思いますが、要は「アプリケーションが開発環境だと動くのに本番環境だと動かない」という事態を避けたり、チーム開発をしやすくする事もできるツールだと思っていただければ良いかと。

Webサーバー用とDB用のコンテナ2つ作ればおっけーです。

この時にRailsのdatabase.ymlとdocker-compose.ymlの整合性や環境変数やらでずいぶん苦心しましたが、Web上に落ちているテンプレートをカスタマイズする方法でクリアしました。

あと、入社してすぐに使いましたw

ポイント3:自動テストのためCircleCI導入

「未経験者でCircleCI使ってる人あまりいない」と現役エンジニアの方に言われました。
みなさんバックエンドのブラッシュアップに時間を使って、自動テストまで手を伸ばす人はいないようですね。

ただしこれについては、費やした時間に対してのリターンは少なかったと感じました。
というのも、自動テストというのは全くパッと見に影響しないものです。
未経験者のポートフォリオというものはあまりじっくり見てもらうことができないため、選考・面談の際には話題にすらあがらなかった・・・・。
(見てくれる人が採用担当だったら高い評価をえられたかも?)

バックエンドの領域で十分な機能を実装したうえで、時間に余裕があったら導入するくらいが良いのかなと。
おそらく多くのAPIを使用する方が評価が高まるだろうと思います。

私がポートフォリオに盛り込んだ強みは以上です。

ポートフォリオ作成にあたり気をつけた方がいいなと思ったこと

UI/UXの整備

「ユーザーインターフェイス/ユーザーエクスペリエンス」の略
見た目と、それによる使いやすさですね。
例えばどこにログインボタンがあるか分からなかったら使いにくいですよね・・・。そういった成果物は評価を得づらいということです。

ユーザー(ここで言う企業の選考担当者・評価者)がパッとみてどう使えば良いかわかりやすいかと言うのはWebサービスではとても重要です。

何人か未経験者のポートフォリオを拝見しましたが、これが整っていない方のモノは正直あまり使ってみようとは思えませんでした・・・。
私がそう思うということは、ユーザーはよりいっそう使用する気が失せるということ。つまり採用担当者に自分の頑張りを見てもらうことすらできなくなるわけです。

スクリーンショット 2020-01-28 3.01.57.png

「ログインしなければ使えない」は論外

採用担当者がじっくりとポートフォリオを見てくれたことはほとんどなかったです。

そんななかで″自分のメールアドレスを打ち込みパスワードを決めて、その後ログインして使う″という動作をさせるというのは、そもそもサービスの設計としてユーザー側への配慮が足りていないと言わざるを得ません。
UI/UXでも同じことが言えますが、「どのようにユーザーに使ってもらうか」を考えながら作るべきだなと思いました。

記事投稿サービスであれば、記事を見るのはログイン不要。
投稿にはログイン要。
とすれば良いと思います。

「かんたんログイン」のようにワンタッチで仮ログインができる機能があったら、「ユーザーへ配慮した設計ができる」という点でも採用者からの評価も良いのではないでしょうか!
スクリーンショット 2020-01-28 3.07.19.png
ログアウト状態でも記事は見れます。

セキュリティへの意識を見せる

昨今は社会的に情報セキュリティへの意識が高まっています。
企業の意識が高い部分に合わせてポートフォリオを作成することはとても重要だと思いました。
例えばパスワード入力を伏せ字にするだけでも構いません。
できればSSL化して通信方法をhttpsにするとさらに良いですが、そこは自分の余力と相談で良いかなと思います。

ここまでを踏まえたうえで、使用技術がマッチした会社の選考でしっかりとアピールできれば内定に近づけると思います。

ただし!

個人的に最重要だと思うのは人間性やコミュ力だというのが個人的な感想。

ここまで読めばわかるように、実際に私が作ったポートフォリオは「ハイレベル」というところまでは達していないと思います。

(自画自賛みたいになってしまいますが)内定をいただけた会社もそうでなかった会社でも、採用担当者の方からは人間性を評価されてました。

そういった就活に関わる部分については、また記事にしたいなーとおもってます

前回の記事にいいね・ストックしてくださった皆さんありがとうございます?

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

Rails コーティング規約について 3

はじめに

Ruby、Railsの基礎を学習中の方に向けて記載致します。
Rubyのコーティング規約はコチラをクリック願います。
Railsのコーティング規約 2 はコチラをクリック願います。
私自身これからチーム開発を行う上で大事にしたい。知っておきたいことをOutputします。

ActiveRecord Queries

"sexy" validations を利用する。

利用はしていたが、名称は知りませんでした・・・

# 悪い例
validates_presence_of :name

# 良い例
validates :name, presence: true

Mailers

view で email へのリンクを記載する際には、_pathでなく_urlを利用する。

_url が生成するURLはホスト名を含むが、_pathメソッドのそれは含まない為のようです。

qiita.rb
# 悪い例
詳細は下記のリンクをご参照ください。
= link_to 'こちらをクリック', course_path(@course)

# 良い例
詳細は下記のリンクをご参照ください。
= link_to 'こちらをクリック', course_url(@course)

さいごに

コーティング規約については毎日更新します。
皆様の復習等にご活用頂けますと幸いです。

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

【railsチュートリアル】ローカル環境でテストコードを通す方法

railsチュートリアルをローカル環境で開発時に、
ルーティング、コントローラ、ビュー、テストにコードを正しく記述しているにも関わらず、テストが通らずエラーで解決に非常に時間がかかりました。
開発環境はvagrantで、テキストエディタはVScodeを使っています。

原因

・minitestのGemを入れてなかった
・railsのバージョン5.2未満だった

説明

・テスト実行時はrspecやminitestなどをよく使いますが、勘違いしてrspecのGemを入れていたため、正常に動作しなかったです。
(当然ですねw)

・railsはバージョンが5.1から5.2にアップグレードする際に、大きな変更があったようで、secret_key_baseという秘密鍵の要求が必須だったものがなくなったようです。
つまり5.1系だと秘密鍵を要求されエラーになります。
railsチュートリアルで推奨されているバージョンが5.1.6なので(私含め初学者の方が)陥りやすい点かと思います。

※補足
herokuでデプロイ時にはrailsバージョンを5.1にした方がいい場合があるので、デプロイ時のみバージョンを下げるもしくは、発生するエラーに対処する必要があるかもしれません。

対策

・minitestのGemを追加

/Gemfile

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.10.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end

bandle installを実行

$ bundle install

・railsのバージョンを5.2以上に変更

config.load_defaults を5.2にする。

/config/application.rb
require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module アプリ名
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2
    # config.active_record.sqlite3.represent_boolean_as_integer = true
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end

アプリで使っているrailsのバージョンを確認

bundle exec rails -v
=> Rails 5.1.6

Gemfile内のrailsのバージョンを5.2以上にして,
bundle updateを実行

gem 'rails',        '~> 5.2.0'
$ bundle update rails

バージョンを確認すると

$ rails -v
=> Rails 5.2.4.1

これでテストを実行すると、正常に動作しました。

まとめ

・機能面でのエラーがあったらその使いたい機能は何であるか認識することと、それがGemfileにあるか確認する。
・railsのバージョンは慎重に扱う。
・railsはシステムの脆弱性の改善を施してから、バージョンアップしていることが多いのでバージョンを下げる行為はなるべく避けた方が良い。
・Gemfileに書いたことはbundle installによってGemfile.lockに反映される。それを読み込んで処理等が実行される。

参考

https://discuss.circleci.com/t/missing-secret-key-base-for-test-environment-set-this-value-in-config-secrets-yml/5179/2

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

【rails tutorial 3.4.4】ローカル環境でテストコードを通す方法

railsチュートリアルをローカル環境で開発時に、
ルーティング、コントローラ、ビュー、テストにコードを正しく記述しているにも関わらず、テストが通らずエラーで解決に非常に時間がかかりました。
開発環境はvagrantで、テキストエディタはVScodeを使っています。

エラー文

テスト実行時のエラーは以下になります。
DEPRECATION WARNING: You didn't set secret_key_base. Read the upgrade documentation to learn more about this new config option. (called from block in class:StaticPagesControllerTest at /vagrant/re_learn/test/controllers/static_pages_controller_test.rb:23)
ERROR["test_should_get_help", StaticPagesControllerTest, 0.29687339199881535]
test_should_get_help#StaticPagesControllerTest (0.30s)
RuntimeError: RuntimeError: Missing secret_key_base for 'test' environment, set this value in config/secrets.yml
test/controllers/static_pages_controller_test.rb:23:in `block in class:StaticPagesControllerTest'

原因

・minitestのGemを入れてなかった
・railsのバージョン5.2未満だった

説明

・テスト実行時はrspecやminitestなどをよく使いますが、勘違いしてrspecのGemを入れていたため、正常に動作しなかったです。
(当然ですねw)

・railsはバージョンが5.1から5.2にアップグレードする際に、大きな変更があったようで、secret_key_baseという秘密鍵の要求が必須だったものがなくなったようです。
つまり5.1系だと秘密鍵を要求されエラーになります。
railsチュートリアルで推奨されているバージョンが5.1.6なので(私含め初学者の方が)陥りやすい点かと思います。

※補足
herokuでデプロイ時にはrailsバージョンを5.1にした方がいい場合があるので、デプロイ時のみバージョンを下げるもしくは、発生するエラーに対処する必要があるかもしれません。

対策

・minitestのGemを追加

/Gemfile

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'minitest',                 '5.10.3'
  gem 'minitest-reporters',       '1.1.14'
  gem 'guard',                    '2.13.0'
  gem 'guard-minitest',           '2.4.4'
end

bandle installを実行

$ bundle install

・railsのバージョンを5.2以上に変更

config.load_defaults を5.2にする。

/config/application.rb
require_relative 'boot'

require 'rails/all'

# Require the gems listed in Gemfile, including any gems
# you've limited to :test, :development, or :production.
Bundler.require(*Rails.groups)

module アプリ名
  class Application < Rails::Application
    # Initialize configuration defaults for originally generated Rails version.
    config.load_defaults 5.2
    # config.active_record.sqlite3.represent_boolean_as_integer = true
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration can go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded after loading
    # the framework and any gems in your application.
  end
end

アプリで使っているrailsのバージョンを確認

bundle exec rails -v
=> Rails 5.1.6

Gemfile内のrailsのバージョンを5.2以上にして,
bundle updateを実行

gem 'rails',        '~> 5.2.0'
$ bundle update rails

バージョンを確認すると

$ rails -v
=> Rails 5.2.4.1

これでテストを実行すると、正常に動作しました。

まとめ

・機能面でのエラーがあったらその使いたい機能は何であるか認識することと、それがGemfileにあるか確認する。
・railsのバージョンは慎重に扱う。
・railsはシステムの脆弱性の改善を施してから、バージョンアップしていることが多いのでバージョンを下げる行為はなるべく避けた方が良い。
・Gemfileに書いたことはbundle installによってGemfile.lockに反映される。それを読み込んで処理等が実行される。

参考

https://discuss.circleci.com/t/missing-secret-key-base-for-test-environment-set-this-value-in-config-secrets-yml/5179/2

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

Railsでsvgが扱いにくかったのでsvg_helperというgemを作りました。

現状の(Railsでの)svg

現状のrailsでのsvgの扱いは大きく3つに分けられます。

  • viewから<%= image_tag %>で呼び出す方法
  • cssで背景として呼び出す方法
  • viewsvg自体をベタ書きする方法

これらの方法の中でcssfillを使ってsvgの色を変更できるのは3番目の方法のみとなっています。

個人的にsvgcssを使って色などを変更できるのが一番のメリットだと考えています。

しかし、現状のRailsではviewにベタ書きする方法でしかsvgcssを適用することができません。

使いにくいです。。。
とても使いにくいです。。。
なので、簡単にsvgを扱えるgemを作りました。

svg_helper(gem)

上で書いた問題を解決できるのが、今回紹介するsvg_helperです。

使いたい人はご自由にお使いください。

導入方法

Gemfileにsvg_helper, github: nir-searchright/svg_helperを追加してbundle installします。

現状、RubyGemsには登録していないのでgithubのurlは必須です。

gem 'svg_helper', github: 'nir-searchright/svg_helper'

application_helper.rbrequireするだけで準備は完了です。

application_helper.rb
require 'svg_helper'

用意するsvgファイル

↓こんな感じのsvgの中身だけくり抜いたsvgファイルを用意します。

<g>
 <path 内容></path>
</g>

viewでの呼び出し方

app/images/配下に配置したsvgファイルのpathを記述します。

基本的な使い方は<%= image_tag %>と同じです。

<%= svg_tag('path名') %>

<%= svg_tag('path名') %>にはidclassonclickを指定できます。

<%= svg_tag('path名', id: "id名", class: "クラス名", onclick: "function名") %>

これでsvgcssを簡単に適用することが可能になり、さらに同じsvgファイルを使い回すことができるようになりました。

最後に

少し作りが雑な気がしますが、僕が自分で使うために作ったのでいいかなと思っています。

改善希望などがありましたらコメントください。

気が向き次第実装します。

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

postgresで任意のid順にorder by

任意のid順にorder by

例えば手元にこのようなidsがあり、このidsの順番でuserを取得したいとき

ids = [2,3,1,10,9]

これでうまくいくかも

users = User.order("COALESCE(array_position(ARRAY[#{ids.join(",")}], id), 0) asc")

たまにこういうこと並び順が必要になること
ありますよね

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