30代プログラム初心者がWEBエンジニアになる

30代プログラム初心者が、WEBエンジニアになるまでの奮闘を書いていきます。

jbuilderについて

こんにちは、ぐっちと申します。

今回は今までなんとなく使っていたjbuilderについて書きたいと思います。

 

そもそもRailsjbuilderが使用できるのは、$ rails new で作成した時点でRails4からはデフォルトでgemが入っているからです。

Gemfile をみると

gem 'jbuilder', '~> 2.5'

 

と記述がありました。

 

jbuilderとは
xxx.json.jbuilderファイルに記述するとJSONにして返してくれるという物。
難しいjson形式を返す時などに便利。

 

jbuilderの書き方

Modelを使わない書き方

一番シンプルな形式

json.set! :key, 'value'

# {"key":"value"}

入れ子

json.set! :key1 do
  json.set! :key2, 'value'
end

# {"key1":{"key2":"value"}}

下のような書き方もできます

json.key1 do
  json.key2 "value"
end

# {"key1":{"key2":"value"}}

キー名が被ると合成されます

json.set! :key1 do
  json.set! :key2, 'value'
end

json.set! :key1 do
  json.set! :key4, 'value'
end

# {"key1":{"key2":"value","key4":"value"}}

Modelを使った書き方

カラム指定で記述

json.(User.first, :id, :created_at)

# {"id":1,"created_at":"****-**-**"}

Modelの配列 は下のように書けます

json.users User.all, :id, :created_at

# {"users":[{"id":1,"created_at":"****-**-**"},{"id":2,"created_at":"****-**-**"}]}

下のような書き方もできます

json.users User.all do |item|
  json.id user.id
  json.created_at user.created_at
end

# {"users":[{"id":1,"created_at":"****-**-**"},{"id":2,"created_at":"****-**-**"}]}

配列を返す場合は下のようになります

json.array! User.all do |item|
  json.id user.id
  json.created_at user.created_at
end

# [{"id":1,"created_at":"****-**-**"},{"id":2,"created_at":"****-**-**"}]

 

 

今までは、一番シンプルな形しか使った事がなかったですが、調べると色々な記述の仕方がありデータの渡し方も色々対応できる事がわかりました。

 

ここまで読んでくださり、ありがとうございました。

 ツイッターで日々の学習をつぶやいています

@Yamaguc45844169

 

 

本番環境でrake db:seedを実行する際の注意点

こんにちは、ぐっちと申します。

以前9月頃の記事でSEEDファイルについて書きましたが、そのSEEDファイルを本番環境で実行し、データを登録しようとした際に手間取ったので、その事について書きたいと思います。

 

問題点

以前の記事で

$ rake db:seed: category

コマンドでdb/seedsにあるcategory.rbを実行できる様にしました。

しかしいざ本番環境(EC2)で実行したところ、データが登録されていない……

スペルミス等を疑い何度も試しましたが、結果は同じでした。

 

やり方が間違っているのかと思い調べてみると、すぐに解決策が見つかりました。

解決方法

結論から言うと、環境の指定が必要です。

本番環境では

$ rake db:seed: category RAILS_ENV=production

とコマンドを打つ必要があります。

しかし、それでもデータが登録されない……

さらに調べると、コマンドを打つディレクトリが関係しており、

 /var/www/アプリ名 でコマンドを打つのではなく、

/var/www/アプリ名/current まで移動して実行すればデータ投入ができました。

 

これまでも何度か開発と本番環境の違いで思う様に行かない事がありました。

こういった事は、記事等に残し同じ事で悩まない様にしていきたいです。 

 

ここまで読んでくださり、ありがとうございました。

 ツイッターで日々の学習をつぶやいています

@Yamaguc45844169

チーム開発での学び

こんにちは、ぐっちと申します。

無事最終課題発表会も終わり、長い様で短かった11週間が終わりました。

このチーム開発で色々と学ぶ事がありました。

 

1.本当にこれまでの知識・経験で完成出来るのか、不安でしたが、

チームメンバーの協力、一つ一つのタスクを地道にやっていった事で、無事完成させる事が出来て自信になりました。

 

2.以前は個人開発の為、自分の感性でコードを記述し実装していましたが、

チーム開発を経験し、他人が見ても分かりやすいコードをより意識する様になりました。

 

3.各機能を実装する為に、どの様なコード・技術を使えば良いのか想像がつきませんでしたが、調べるとどこかには情報があり、諦めず調べる事・検索能力の重要性に改めて気付かされました。

 

4.互いに切磋琢磨し進める大事さを学べました。

メンバーが各々コード書いて各機能を実装していきましたが、この記事を参考にしたと情報を共有する事で、新たな技術を勉強出来、また自分も頑張らなければいけないとモチベーションの維持にも繋がりました。

 

今回チームメンバーは半分が初対面でしたが、同じ目標に向かって互いに協力し合い、良いものが作成できたと思います。

また個人開発では学べない事を多く学ぶことが出来て、とても良い経験だったと思います。今後この経験を活かしていきたいと思います。

 

ここまで読んでくださり、ありがとうございました。

ツイッターで日々の学習をつぶやいています(@Yamaguc45844169

 

 

最終課題、遂に発表会へ

こんにちは、ぐっちと申します。

最終課題として取り組んできたチーム開発も、残るは明日の発表会のみとなりました。

11週間という期間でしたが、長い様で短い充実した時間だったと思います。

 

私たちのチームは4人で、それぞれ全く違った働き方をしているので全員で顔合わせが出来る事が稀でした。

しかし、Slackやビデオ通話といったツールを活用してコミュニケーションを取らない日はありませんでした。

個々で今やっている事や困っている事を報告し合い、助け合いながら進めて来ました。

それがモチベーション維持にも繋がり、スムーズに開発を進める事ができました。

 

チーム開発という初めて行う事に当初は本当に不安しかなく、最後まで出来るだろうかと思っていましたが、今振り返るとコツコツ一つずつやっていけば、なんとかなるのだと実感しています。

メンバー同士の助け合いや、情報共有が大事だと学べました。

他にもこの期間で新しく使ったメソッドや、ライブラリなど色々勉強ができました。

明日は自信を持って発表会に臨みたいと思います。

 

ここまで読んでくださり、ありがとうございました。

ツイッターで日々の学習をつぶやいています(@Yamaguc45844169

ぼっち演算子の使用について

こんにちは、ぐっちと申します。

前回便利なぼっち演算子について書きましたが、使用していると記述に注意すべき所があり、それについて書きたいと思います。

 

もう一度書きますがぼっち演算子とは

ぼっち演算子

 Ruby 2.3で導入された  &. 演算子safe navigation operator)の事で、

レシーバーであるオブジェクトがnilでなければそのまま結果を返し、nilの場合はnilを返すメソッド。

前回は

current_user&.id

 という使い方をしていましたが、これが

current_user.where.not(hoge: nil).count

というコードだった場合

 

current_user&.where.not(hoge: nil).count

 これで良いと思っていましたが、 NoMethodErrorが出て

???という感じになっていましたが、調べてみるとレシーバー全てに&.を付けるという事でした。 

 

current_user&.where&.not(hoge: nil)&.count

これで問題なく行けました。

 

初めて使用するものは良く調べて、仕様を把握しておく事が大事だと学びました。

 

ここまで読んでくださり、ありがとうございました。

 ツイッターで日々の学習をつぶやいています

@Yamaguc45844169

 

 

 

 

ぼっち演算子が便利だった

こんにちは、ぐっちと申します。

開発をしていて、gem devise のヘルパーメソッドで current_user がありますが、ログインしていない時にこのメソッドが呼ばれる事があり、当然ログインしていない為、current_user は nil で、例えば current_user.id としていると

 

 NoMethodError

undefined method `id' for nil:NilClass

 

この様なエラーが出ます。 

 

 これを回避する為に、どうしようか考えて条件で

if current_user == nil 

を記述して、まず current_user が nil の場合の処理を記述する必要があるのかなと思っていましたが、ちょうどスクールが提供しているミニドリルを解いている時に、「ぼっち演算子」なる物が出てきました。

ぼっち演算子

 Ruby 2.3で導入された  &. 演算子safe navigation operator)の事で、

レシーバーであるオブジェクトがnilでなければそのまま結果を返し、nilの場合はnilを返すメソッド。

 

これが今回やりたかった事にドンピシャで

current_user&.id

 と書けば、current_user が nil の場合 nil を返してくれる様になり、エラーが出なくなります。

 

たった一文字追加するだけで、煩わしい分岐を使わないで良くなり感動しました。

 

ちなみに、ぼっち演算子という命名は、&の記号が一人ぼっちで膝を抱えている人に見える所から来ている様です。

f:id:Yamaguchi-T:20191020194711p:plain

 

ここまで読んでくださり、ありがとうございました。

 ツイッターで日々の学習をつぶやいています

@Yamaguc45844169

 

 

 

本番環境で背景画像が表示されない

こんにちは、ぐっちと申します。

 

今回は開発時には問題なく表示されていた背景画像が、デプロイ後本番環境で表示されないという問題と対処法について書きたいと思います。

 

スタイルシート show.scss に

background-image: url('bg-image02.png');

この様な記述があり、ローカル環境でアクセスした際は問題なく画像が表示されます。

しかし、本番環境では表示されない。エラーが出る訳ではなく、ただ表示されない。

 

原因が分からず、色々調べるとAsset Pipelinという仕組みが関係していることが分かりました。

Asset Pipeline

app/assets以下にcssや、js、画像ファイルといったファイルを配置しています。これらを「高速に」「キャッシュに悪さされないように」本番に反映させるのが、Asset Pipelineの役割です。

 

「高速に」の方は知っていましたが、今回影響しているのは「キャッシュに悪さされないように」の方でした。

・キャッシュに悪さされないように

digest」という仕組みで、application.scssやbg-image02.pngといったようにファイルには名前が付いています。

しかし、アップデートしていくと、ファイル名は以前と変化していないが、中身は更新されているという事になると思います。

それがキャッシュによって、更新済みのものではなく、更新前の同じファイル名のものが読み込まれるという事態を防ぐのがこの仕組みです。

 

具体的には、app/assets以下に配置されたファイルが、コードが更新されるごとにファイル名にユニークな拡張子がつけられる様になります。

 

今回の例では、bg-image02.png は bg-image02-***.png という様に拡張子が付けられます。

さらに、デプロイされると、app/assets以下のファイルは全て
public/assetsに上記のdigest付きになって移動されます。

 

これが原因で本番環境では、画像が表示されませんでした。

確かに、ファイル名が変わってしまってはurl指定で読み込める筈がありません。

解決方法

では、どう対処するのかですが

background-image: image-url('bg-image02.png');

という記述に変更します。

 

urlを指定するのではなく、Railsが指定しているimage-urlメソッドを使うことで、デプロイ時にapp/assetsからpublic/assetsにファイルが移動する際に、自動的にファイルにdigestを付与してくれるようになります。

 

 今回の事でやはり開発環境とデプロイ後の環境は違い、色々な問題が発生するのだと体感できました。

こういった事を解決し、また一つ学習出来て良い経験になりました。

 

ここまで読んでくださり、ありがとうございました。

 ツイッターで日々の学習をつぶやいています

@Yamaguc45844169