- 1. ActiveRecordのコードを追う
- 2. Day11
- 3. Docker rails mysqlで環境構築しよう!
- 4. 【Rails】条件に応じてデータ数を取得する
- 5. RailsでRakeタスクの作成手順
- 6. date_selectで入力した日付がDBに保存されない!
- 7. rails routesコマンドについて
- 8. gem activerecord-import の README を翻訳しました
- 9. ridgepoleで外部キーをつける
- 10. 隣接するレコードを取り出す方法
- 11. 一度に複数のAPIリクエストを送るとRails serverがハングアップする
- 12. chart.js使ってグラフ作成してみた
- 13. rails routes member と collectionの違い
- 14. 【開発ログ⑨】社員登録ができなくなった?
- 15. 【開発ログ⑧】社員登録しようとしたら、ウチの会社じゃない支社も出てきた
- 16. 【開発ログ⑦】Posticoにデータがない事件
- 17. 【Rails】前までEC2の本番環境が動いていたのにcapistranoでの自動デプロイを実装した後に改めて本番環境で動かすと111: Connection refusedになる際の対処法
- 18. 【超簡単!】【Rails】ancestry 親子孫を一括管理
- 19. rails 他人の詳細ページを編集不可にする際の注意点
- 20. Railsのアセットパイプライン
ActiveRecordのコードを追う
# テーマ
コードを追うための考え方と、追うことで得られることを、実際に追ってみることで考えてみる
(↑をまとめつつ、ついでにARの内部の作りを知る)
—
# 追いかけるターゲット
“`ruby
User.where(name: ‘Hoge’).first
“`—
# 注意
– Railsのバージョンは6.0.2.2
– データベースはPostgreSQL—
# まずは準備
“`sh
$ mkdir ar_experiment && cd ar_experiment# Gemfileを作成
$ bundle init# Gemfileで以下のgemを指定
gem ‘activerecord’
gem ‘pry’# install
$ bundle install# activerecordをrequireしつつpryを開始
bundle exec pry -ractive_record
“`—
## 進む前に: pryの `show-source` を使おう
ソースをすぐに読めるのでとても便利。
公式に他にもいく
Day11
■kaminariのgem fileでよく使うメソッド
– page/perメソッド“`erb:app/controllers/tweets_controller.rb
変数名 = クラスを利用して取得したレコードのインスタンス.page(params[:page]).per(表示したい件数)#indexに5tweetだけ表示する場合
def index
@tweets = Tweet.page(params[:page]).per(5)
end
“`– paginateメソッド
“`erb:app/views/tweets/index.html.erb
<%= paginate(@tweets) %>
“`
→page/per/paginateメソッドで、表示件数の制限が可能■renderメソッド(復習)
1. 部分テンプレートにしたい箇所を切り取って、_xxxx.html.erbという名前のFileを作成。
2. 部分テンプレを表示したい箇所に記述。“`erb
<%= render partial: "xxxx"(階層が違う場合は/で階
Docker rails mysqlで環境構築しよう!
今回はDockerにrails、MySQLの環境構築を行いました。
##Dockerはdocker-for-macを使用しています
・Docker version 19.03.8
・ruby version 2.5.3
・rails version 5.2.4.2
・MySQL version 8.0.13こちらの環境を構築していきます。
###1、まずはディレクトリを作成します
今回はDockerディレクトリを作成し
その中にsampleディレクトリを作成しました。**sampleはアプリの名前になります。**
こんな感じ↓
“`
% pwd
/Users/hoge/Docker/sample
“`
###2、コードエディターを開きますsampleディレクトリに入り
・Dockerfile
・docker-compose.yml
を作成します。“`:ターミナル
sample % ls
Dockerfile docker-compose.yml
“`
こんな感じになってると思います。↑##3、Dockerfileに記述をしていきましょう
【Rails】条件に応じてデータ数を取得する
最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです!#条件式を使用する
####基本的な条件式
テーブルのデータを条件式で絞って取得する場合。
データを受け取りたいテーブルに紐づくモデルに対して、
`モデル名.where(カラム名: ‘値’)`“`
User.where(artist: ‘sample’)
“`#countメソッドを使用してデータ数を数える
“`
User.where(artist: ‘sample’).count
“``puts`で標準出力する
“`
puts User.where(artist: ‘sample’).count
“`#参考記事
・[【Rails】条件に応じてデータを取得する](https://qiita.com/Hal_mai/items/babb19560ace072c99f5/)
・[【Rails】世界で一番分りやすく詳しいcountメソッドの使い方](https://
RailsでRakeタスクの作成手順
最近の勉強で学んだ事を、ノート代わりにまとめていきます。
主に自分の学習の流れを振り返りで残す形なので色々、省いてます。
Webエンジニアの諸先輩方からアドバイスやご指摘を頂けたらありがたいです!#1.Rakeタスクファイルを生成
“`
$ rails g task task_sample
“`
作成されたrakeファイル“`lib/tasks/task_sample.rake
# 名前空間
namespace :sample do
# タスクの説明 desc => description(説明)
desc “”
# task_name => タスクの名前
task task_name: :environment do
# 実行したい処理を記述する場所
end
end
“`
定義したタスクがきちんと表示するコマンド“`
rake -T
“`
以下のような名前のタスクが存在すれば定義は成功です。“`
rake sample:task_name # 実行したい処理を行うタスク
“`#2.カラムのRecordをUpdate
date_selectで入力した日付がDBに保存されない!
#date_selectとは?
生年月日を入力してもらう際、ユーザーに直接入力してもらうのではなく選択式で入力してもらうようにしたい場合
date_selectというものを使う
“`haml:
.member-main__form
= f.label ‘生年月日’, {class: ‘member-main__form–label’}
%span.member-main__form–require 必須
%p.member-main__form–select
!= sprintf(f.date_select(:birthday, require:true,with_css_classes:’XXXXX’, prompt:”–“,use_month_numbers:true, start_year:Time.now.year, end_year:1900, date_separator:’%s’),’年 ‘,’月 ‘)+’日’
“`
rails routesコマンドについて
【開発環境】
macOS Catalina
バージョン 10.15.3
ruby 2.5.1
Rails 5.2.4.2
visual studio code#rails routesコマンドについて
railsでルーティング設定をした後にルーティングの行き先どうなってるっけという時に使えます。“`
$ rails routes
“`ターミナルに入力すると
例
“`
Prefix Verb URI Pattern Controller#Action
posts GET /posts(.:format) posts#index
(以下省略)
“`という風に表示されれば成功です。
Verb GET : HTTPメソッド、今回はGETです。
GETメソッドはページを表示する操作のみを行う時に使いますね。URI Pattern : WebサイトにおけるURLのようなものです。
Controller#Action posts#index : リクエストを処理するコントローラーとアクションを表しています。
今回ですと、post_cont
gem activerecord-import の README を翻訳しました
# 概要
gem [activerecord-import](https://github.com/zdennis/activerecord-import) の [README](https://github.com/zdennis/activerecord-import/blob/master/README.markdown) を翻訳しました。– 翻訳について
– 翻訳サービス [Deepl](https://www.deepl.com/translator) と [Goole翻訳](https://translate.google.co.jp/) の訳文を参考にしている箇所があります。
– 翻訳対象の[コミットハッシュ](https://github.com/zdennis/activerecord-import/commit/ef425b13e94d258f3c174dc54185fb113433095c)
– 非公式の翻訳です。
– 訳文がおかしい箇所があったら指摘をもらえると幸いです。– ライセンスについて
– [activer
ridgepoleで外部キーをつける
### はじめに
データベース作成に`ridgepole`を使ってみました。
マイグレーションファイルが増えず、カラムの追加や削除も簡単なのがいいですね。
ただ、外部キーの作成時に迷ったことがあったので残しておきます。### 外部キーのつけかた
まずは、GemのGitHubを見てみます。“`scheme
create_table “parent”, force: :cascade do |t|
endcreate_table “child”, id: false, force: :cascade do |t|
t.integer “id”
t.integer “parent_id”
endadd_index “child”, [“parent_id”], name: “par_ind”, using: :btree
add_foreign_key “child”, “parent”, name: “child_ibfk_1”
“`MySQLではインデックスを勝手に貼ってくれるみたいなので、`add_index`は書かずに、`add_foreign_ke
隣接するレコードを取り出す方法
**2020年5月13日 追記あり**
## はじめに
メルカリとかで商品詳細見てると、前のアイテムとか次のアイテム、みたいなリンクありますよね。
その機能をどうやって実装するかを書いて行きます。こんなやつです。
![7b3abffda8c84d4b8892c25a2d515669.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577535/e292026d-317f-69b7-100b-ff95abbccacd.png)## 環境
環境は関係ない普遍的なやり方ではあると思いますが一応。。。
Ruby on Rails 5.2.4
Ruby 2.5## 考え方
当初は単純に以下のように書いていました。“`ruby:items_controller.rb
def show
@item = Item.find(params[:id])
end
“`“`ruby:show.html.haml
= link_to “前の商品”, item_path(@item.id – 1)
=
一度に複数のAPIリクエストを送るとRails serverがハングアップする
## 現象
– ローカルで一度に複数の API リクエストを送ると Rails server がハングアップする
– `Ctrl + C` を押下してもプロセスを終了できなくなる
– lsof コマンドと kill コマンドを実行するなどして、プロセス終了させる必要がある## 再現した環境
– rails: `v5.0.7.2`
– 注意:`v5.2` 以上では解決されている
– 参考:https://github.com/rails/rails/pull/36939## 解決方法
### 1. パッチを適用する
– rails に `v5.2` でマージされた修正をパッチとして適用することで解決できる
– 参考:https://github.com/rails/rails/pull/36939“`diff:actionpack/lib/action_controller/metal/params_wrapper.rb
def model
– super || synchronize { super || self.model =
chart.js使ってグラフ作成してみた
#Railsで作成したアプリにグラフを簡単に入れる方法
##環境
ruby 2.5.0p0
Rails 5.2.4.2
slim##サンプルイメージ
こんなグラフが簡単に出来上がります。
##手順
gem インストール
“`
$ gem ‘chart-js-rails’, ‘~> 0.1.4’
“`“`
bundle install
“`chart.js インストール
“`ruby:package.json
{
“name”: “hoge”,
“private”: true,
“dependencies”: {
“chart.js”: “^2.7.1” ←★追記
}
}
“`“
rails routes member と collectionの違い
#rails routes member と collectionの違い
`resources(RESTfulルーティング)`を利用すると7つのデフォルトのルーティング`(index,create,new,edit,show,update,destroy)`が自動で生成されます.
ただ,自分で定義した独自のアクションへのルーティングを設定する場合は`member`または`collection`というオプションを利用する必要があります。
その際に,memberとcollectionの違いが気になり調べたので両者の違いをまとめます。
## 目次
* [はじめに](#はじめに)
* [やりたいこと](#やりたいこと)
* [やり方](#やり方)
* [おまけ](#おまけ)## はじめに
検証用にPostsコントローラへのルーティングファイルを作成します.
“`ruby:routes.rb
Rails.application.routes.draw do
resources :posts
end
“`
デフォルトで以下の7つのルーティングが生成されます.`(ind
【開発ログ⑨】社員登録ができなくなった?
# 前提について
はじめまして、 プログラミングスクールに通ういりふねと申します。この記事は、スクールの課題である個人アプリの開発の記録を書くことで、自身のアウトプットに利用しています。もし、読んでいただけた方がいましたら、フィードバックをしていただけたら嬉しいです。開発するのは「有給休暇管理ツール」です。仕様は[過去記事](https://qiita.com/iczo32/items/97ad7d4baa985b3b99ca)をどうぞ。
アプリはデプロイまで行いますが、サービスとして提供するものではありません。あくまでも自学習の一環ですので、ご理解下さい。では本題へどうぞ。
#今回の実施内容
前回までで、支社と社員の登録が完成しました。記事では取り上げませんが、ビューページの左カラムに登録した支社名と支社に所属する従業員数が、メインビューの有休管理一覧の「名前」と「入社日」に登録した社員のものが各表示されるようにeach文を記述しました。結果は以下のとおりです。
【開発ログ⑧】社員登録しようとしたら、ウチの会社じゃない支社も出てきた
# 前提について
はじめまして、 プログラミングスクールに通ういりふねと申します。この記事は、スクールの課題である個人アプリの開発の記録を書くことで、自身のアウトプットに利用しています。もし、読んでいただけた方がいましたら、フィードバックをしていただけたら嬉しいです。開発するのは「有給休暇管理ツール」です。仕様は[過去記事](https://qiita.com/iczo32/items/97ad7d4baa985b3b99ca)をどうぞ。
アプリはデプロイまで行いますが、サービスとして提供するものではありません。あくまでも自学習の一環ですので、ご理解下さい。では本題へどうぞ。
# 今回実施する内容
支社登録が実装できたので、続けて社員の登録の実装を行います。社員は必ず1つの支社に所属しています。社員の登録画面のポイントは、ユーザーが登録した支社を選択できるようにすること。逆に他のユーザーが登録した支社は自社に関係なので表示させたくありません。手順は概ね[前回の記事](https://qiita.com/iczo32/items/6014cf45afd07b3261a8)と同じな
【開発ログ⑦】Posticoにデータがない事件
# 前提について
はじめまして、 プログラミングスクールに通ういりふねと申します。この記事は、スクールの課題である個人アプリの開発の記録を書くことで、自身のアウトプットに利用しています。もし、読んでいただけた方がいましたら、フィードバックをしていただけたら嬉しいです。開発するのは「有給休暇管理ツール」です。仕様は[過去記事](https://qiita.com/iczo32/items/97ad7d4baa985b3b99ca)をどうぞ。
アプリはデプロイまで行いますが、サービスとして提供するものではありません。あくまでも自学習の一環ですので、ご理解下さい。では本題へどうぞ。
# 今回実施する内容
前回までで、仮データを入れたビューが完成しました。今回は、支社の登録を行って、きちんとデータベースに反映されているかを確認します。– ルーティングの編集
– 支社登録用のbranchコントローラーの作成
– 支社登録を行うビューページを作成
– メインページに支社登録へのリンクを作成
– ローカルブラウザから支社登録の実施
– データベースに保存されているか確認できればOK#
【Rails】前までEC2の本番環境が動いていたのにcapistranoでの自動デプロイを実装した後に改めて本番環境で動かすと111: Connection refusedになる際の対処法
capistranoを実装した後、改めてec2で本番環境を起動すると次のエラーが表示される。
“`
15.179.212, request: “GET / HTTP/1.1”, upstream: “http://unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock:/”, host: “13.115.179.212:80”
2020/05/10 13:10:51 [error] 3847#0: *17 connect() to unix:/var/www/rails/Portfolio/tmp/sockets/unicorn.sock failed (111: Connection refused) while connecting to upstream, client: 121.3.47.42, server: 13.115.179.212, request: “GET / HTTP/1.1”, upstream: “http://unix:/var/www/rails/Portfolio/tmp/sockets/un
【超簡単!】【Rails】ancestry 親子孫を一括管理
# ancestryとは
Ruby on Rails ActiveRecordモデルのレコードをツリー構造(または階層)として編成できるようにするGemです。
親、子、孫のような関係を一括で管理する。# 使い方
1、Gemfileに記述
“`
gem ‘ancestry’
“`2、下記コマンドを忘れないように。サーバーの再起動も合わせて。
“`
$ bundle install
“`3、categoryモデルを作る。
“`
$ rails g model category name:string
“`4、マイグレーションファイルの記述を反映
“`
$ rails db:migrate
“`5、先ほど作ったcategoriesテーブルにancestryのカラムを作成する
“`
$ rails g migration add_ancestry_to_category ancestry:string:index
“`6、追記した内容もDBに反映させる
“`
$ rails db:migrate
“`7、モデルにancest
rails 他人の詳細ページを編集不可にする際の注意点
かなり基本的なところですが、今回アプリを完成させたと思ったら、
自分自身忘れていた箇所だったため、メモします。また、今回はdeviceを使用して作成してます。
#他人のデータを編集不可へ
複数人のユーザーが存在するアプリケーションでは自分のマイページや投稿内容を他人に変更できないように編集アイコンをログインしているユーザ以外表示されないようにしました。
<% if @user.id == current_user.id %>
<%= link_to edit_user_path(current_user.id) do %><% end %>
<% end %><% if
Railsのアセットパイプライン
#アセットパイプラインとは
JavaScript、CSS、画像などのリソース(アセット)を効率的に扱うための仕組み。次に示すパイプライン処理を行うことで、実行速度を早めている。
1.高級言語のコンパイル
CoffeeScript SCSS,ERB,Slimなどで記述されたコードをコンパイルして、**ブラウザが認識できる(これが重要)**JavaScript,CSSファイルとして扱えるようにする2.アセットの連結
複数のJavaScript,CSSファイルを一つのファイルに連結することで読み込みに必要なリクエストを減らして、読み込みを高速化させる。3.アセットの最小化
スペース、改行、コメントを削除してファイルを最小化させ、通信量を節約する。4.ダイジェストの付与
コードの内容からハッシュ値を算出しファイル名の末尾に付与する。これによりコードが変更されればファイル名が変更されるため、ブラウザのキャッシュの影響で修正が反映されないという問題を防げる。参照:[アセットパイプラインについて](https://www.transnet.ne.jp/2016/02/28/r