- 1. Railsチュートリアル 第13章 ユーザーのマイクロポスト – 「プロフィール画面へのマイクロポストの表示」を、テスト駆動で実装していく
- 2. Railsコマンド
- 3. RailsでDBの構築をしてMySQLの日本語検索を使う
- 4. 学んだこと
- 5. Railsの起動を高速化するbootsnapをコードリーディングで理解する
- 6. Rails + Cloudinaryでレスポンシブ対応した画像表示
- 7. routes.rb内コード順でエラーが出る件
- 8. rack2.0.7の脆弱性の話
- 9. [rails] CSV非同期ダウンロードでやったこと
- 10. Railでnot null制約をはずす
- 11. 【Rails】レコード削除時に関連するテーブルのレコードも一緒に削除する方法
- 12. Rails6 のちょい足しな新機能を試す114(database_exists?編)
- 13. [Rails]改行が2文字でカウントされてバリデーションが正しく動作しない件(カスタムバリデータ(validate_eachメソッド)で解決)
- 14. RailsでWebサイト作成
- 15. WEBエンジニアとして一人立ちした個人ロードマップ(実装編)
- 16. 【Rails】RailsでAPIを作る`rails new –api` コマンドざっくりまとめ
- 17. Vagrant + VirtualBoxでつくるRails 6系の環境構築
- 18. ストロングパラメータとは
- 19. Ha4go運用の実績と課題 2019
- 20. Railsアプリ、EC2の本番環境でMySQLを直接いじる方法
Railsチュートリアル 第13章 ユーザーのマイクロポスト – 「プロフィール画面へのマイクロポストの表示」を、テスト駆動で実装していく
# テストを実装するための前提
「ユーザーのプロフィール画面に、当該ユーザーのマイクロポストを表示する機能の実装」についてのテストは、実際にテストを実装していく前に必要となる準備がいくつかあります。
## プロフィール画面用の統合テストを生成する
まずはプロフィール画面用の統合テストを生成することから始まります。`rails generate integration_test`コマンドですね。
“`
# rails generate integration_test users_profile
Running via Spring preloader in process 1793
invoke test_unit
create test/integration/users_profile_test.rb
“`## マイクロポストのfixtureをユーザーと関連付ける
各マイクロポストの`:user`という属性に、有効なユーザー名を渡します。
“`diff:test/fixtures/microposts.yml
most_re
Railsコマンド
Railsコマンドの一覧
○rails newコマンド
→アプリケーションの雛形を作成“`
$ rails new [アプリケーション名] -d mysql
“`「-d(databaseの略) mysql」はオプション
MySQLをデータベースとして使用する○rails serverコマンド
→サーバーを立ち上げる“`
$ rails s
“`
「server」を「s」と略しても良い○Controlキー+Cキー
→サーバーを停止○rails db:createコマンド
→データベースにテーブルを作成“`
$ rails db:create
“`
アプリケーションディレクトリに移動してから実行すること○rails g controllerコマンド
“`
$ rails g controller [コントローラー名] [アクション名]
“`「g」は「generate」の略
コントローラーを作成、定義できる
※コントローラー名は複数形にすること!○rails g modelコマンド
→モデル、migrationファイルを作
RailsでDBの構築をしてMySQLの日本語検索を使う
備忘録的な感じです。本来は優しそうな敬語で書きたいのですが、分量を減らしたいし疲れるのでとっても無愛想な書き方です。キレテナイッスヨッ!!(長州力)
# 目的
現在の[理工展ホームページ](https://rikoten.com/php/pages/events/event_list.php)では検索機能を実装している。ここら辺について、先輩からは「コピペすればいい」といわれたのだが、いつかフレームワークを理工展に導入する可能性を踏まえて、自分で現在のソースコードを研究することにした。もともと先輩が「Mroongaはうまく導入できなかった」とか言っていたのを小耳にはさんでいたので、きっとMySQLの機能を使ったのだろうと思っていた。
実際その通りで、MATCH … AGAINST …を使っているとわかった。MySQL 5.7で対応した、とてもすごい機能とのことで、いろいろと研究してみる。# 内容について
Railsを使わずMySQLクエリを実行した場合の[記事](https://pgmemo.tokyo/data/archives/1274.html)をもとにRail
学んだこと
「show」アクションや「edit」アクションのように「id」パラメータを指定して呼び出すアクションの場合は、モデルオブジェクト(下記では`@blog`変数に格納されている)を使って次のように記述します。
“`erb
<%= link_to 'Show Page', blog_path(@blog) %>
<%= link_to 'Edit Page', edit_blog_path(@blog) %>
“`三項演算子とは
“`rb
if 条件式
A
else => 条件式 ? A:B
B
end
“`
に省略できる
Railsの起動を高速化するbootsnapをコードリーディングで理解する
Rails 5.2 から標準 gem として入っている **bootsnap**
私自身は **install しておくだけで何かをキャッシュしてくれて起動が高速化する・・**ぐらいの理解で使っていたので、改めてコードリーディングを通して bootsnap がどういう仕組で何を解決しているのかを理解してみました。??肝心のコードリーディング部分はWIPです ??
# bootsnap とは
bootsnap は Shopify 社によって開発された Rails/Ruby アプリケーションの起動時間を短縮するためのライブラリです。
Shopify 社によって開発される Shopify は、巨大なモノリシックの Rails アプリケーションであり、 アプリケーションの起動時間が長いことは開発体験の大きな毀損でした。
そこで開発されたのが bootsnap です。
Shopify 社曰く、 bootsnap を利用することで、Rails アプリケーションの起動時間を 50% ほど短縮することが見込めます。[[参考リンク] Bootsnap: Optimizing Ruby App
Rails + Cloudinaryでレスポンシブ対応した画像表示
Railsでアップロードした画像のレスポンシブ表示(スマホ向けに縮小した画像表示)の実装は何が主流でしょうか?私の経験では「RMagickでスマホ向けの縮小画像を生成して表示する」くらいしかありませんでした。ですが、この方法だと複数のディスプレイサイズに細かく対応するのが大変だったり、スマホ・PCで画像を使い分けるのが面倒でした。
ここでは、Cloudinary(CDN + 画像変換サービス)を使って複数のディスプレイサイズに対応したサイズの画像を表示する方法紹介します。# ゴール
最終的に表示するHTMLとしては、imageタグにsrcsetを設定して画像を表示します。[srcsetとは](https://parashuto.com/rriver/responsive-web/picture-srcset-use-case)
Imageタグとsrcsetの例:
“`
routes.rb内コード順でエラーが出る件
# こんなエラー出た。
写真を投稿するRails webアプリケーションを実装中のこと。
**新規ユーザー登録ボタンを押した際**に、こんなエラーが出ました。
![error1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548345/8d08b419-8639-1c37-9f21-e92e85256b59.jpeg)# まずは、エラー文を解読。
#### NoMethodError in UsersController#show
アプリケーション実装段階で作成した、ユーザーの新規登録やログインを担当するUsersコントローラー(UsersController)のshowアクション(#show)定義の中(in)に、メソッド(Method)が無い(No)エラーが起きていますという意味です。下に続くエラー文にその詳細内容が書かれています。#### undefined method’nickname’for nil:NilClass
何も無い(nil:NilClass)に対して(for)、ni
rack2.0.7の脆弱性の話
先週、プライベートのrailsのgithubレポジトリからrackに脆弱性が見つかったから対応してねと連絡が来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/201103/0cc653d0-7be9-822b-a3ea-ac43d8aaf4e5.png)
設定した覚えなかったけどgithubで[こういう設定](https://help.github.com/en/github/managing-security-vulnerabilities/configuring-automated-security-updates)をしていたらしい
`low severity` とありますが、影響範囲おおきそうなのでどのような脆弱性なのか調べてみました。
# どういう脆弱性か
Possible Information Leak / Session Hijack Vulnerability
https://github.com/rack/rack/security/advisories
[rails] CSV非同期ダウンロードでやったこと
#大量データのCSVダウンロード
既存のやり方・問題“`
respond_to do |format|
format.html
format.csv do
~~~~~~
end
end
“`– ロードが長い
– タイムアウトエラーになるこの2つを解決しようとして色々検索して試してみましたが、どれもうまく行かず。
さらには、大量データダウンロードの非同期処理はあんまりやってなさそう(?)ということで、実際に試したことを書いていきます
##解決策
**定時処理でファイル作成-> S3にアップロード**
**リンクでS3のファイルをダウンロード**というやり方に行き着きました。
####それまでに試したこと
非同期処理
挫折ポイント -> job で `send_date` が使えなかった。(ActionController のメソッド(?))
使い方はありそうだったが、うまく行かず断念。##実装
###定時処理
**CSVデータを作成する処理**
“`jobs/file_upload_job.rb
re
Railでnot null制約をはずす
#今回やること
railsでnot null制約がついているカラムの制約を外します。#not null制約をはずす
手順としてはまず下記のようにコンソールに入力、実行しマイグレーションファイルを作成します。“`
rails g migration ChangeColumnToNull
“`出来上がったマイグレーションファイルはdb/migrateに出来上がるので
以下のように、そのファイルに変更したいテーブル、カラム名を記載します。“`
#postsテーブルのカラム名nameのnot null制約を外す例class changeColumnToNull < ActiveRecord::Migration[5.1] def up # Not Null制約を外す場合 not nullを外したいカラム横にtrueを記載 change_column_null :posts, :name, true end def down change_column_null :posts, :name, false end end ```
【Rails】レコード削除時に関連するテーブルのレコードも一緒に削除する方法
# はじめに
Railsでとあるレコードを削除すると、それに紐づいた他のモデルが外部キーで参照できなくなってエラーがでてしまった。
レコードを削除した時に関連するモデルのレコードを一緒に削除する方法を調べたので記載。
結論、dependent: :destroyを使えば解決した。
その他、周辺情報も調べて整理したのでまとめる。
間違っていたら教えていただけると幸いです。#環境
– Ruby 2.5.1
– Rails 5.2.4# 状況
モデルの相関関係を簡略化すると以下のような感じ。
ユーザーがカードを保有していて、そのカードとクーポンが多:多の関係でアソシエーションされている。モデルのアソシエーションはこんな感じ。
“`
Rails6 のちょい足しな新機能を試す114(database_exists?編)
# はじめに
Rails 6 に追加された新機能を試す第114段。 今回は、`database_exists?` 編です。
Rails 6 では、データベースが存在するかどうかを確認する database_exists? メソッドが追加されました。Ruby 2.6.5, Rails 6.0.2.1 で確認しました。 (Rails 6.0.0 でこの修正が入っています。)
“`shell
$ rails –version
Rails 6.0.2.1
“`今回は、データベースが存在するかどうかを確認するスクリプトを作って確認してみます。
# Rails プロジェクトを作成する
“`shell
$ rails new rails_sandbox
$ cd rails_sandbox
“`# スクリプトを作成する
`database.yml` から `development:` の設定を読み取ります。
`database.yml` の `adapter:` の情報から対応するデータベースの Adapter を決定し、 `database_exists?` メソッ
[Rails]改行が2文字でカウントされてバリデーションが正しく動作しない件(カスタムバリデータ(validate_eachメソッド)で解決)
タイトルの通りです。
# 結論
– `ActiveModel::EachValidator`の派生クラスとして`○○Validator`を作る
– その中で改行の文字数カウントを修正してからバリデーション判定早速ですが具体例を見てみましょう。
# 現象
とても簡略化したお問い合わせフォームを用意しました。
文字数制限は50文字とします。
(ちなみにその投稿画面には、javascriptで文字数をカウントして表示しているとします。)“`ruby:view/contacts/new.html.erb
<%= form_with url: contacts_path, method: :post, local: true do |f| %>
<%= f.text_area :message %>
<%= f.submit "送信する" %>
<% end %>
“`必須かつ50文字を超えたらエラーメッセージが表示されます。
“`ruby:model/contact.rb
class Contact < ApplicationRecord validate
RailsでWebサイト作成
#はじめに
[前回](https://qiita.com/takurinton/items/94e75be0f5c65d746023)作成したRailsの環境を使って、今回はデータベースなしで簡単なWebサイトを作成していきたいと思います。[こちら](https://takurunprog.herokuapp.com/)から僕がRailsで作成したWebサイトに飛べます。
ソースコードは[こちら](https://github.com/takurinton/my_web_page)#プロジェクト作成
“`cmd:cmd
rails new mypage
cd mypage
“`はじめに、mypageという名前でプロジェクトを作成します。そうすると、今いるディレクトリの下に自動でたくさんのフォルダが生成されます。そこに移動してWebサイトを制作していきます。
次に、確認作業を行います。コマンドプロンプトで以下のコマンドを実行してください。
“`cmd:cmd
rails s
“`これはRailsのコマンドを使用してローカルのサーバーを建てるという意味のコマンドで
WEBエンジニアとして一人立ちした個人ロードマップ(実装編)
#はじめに
この記事は、[commew Advent Calendar 2019](https://qiita.com/advent-calendar/2019/commew)の25日目の記事です。自分は組み込みをずっとやってて、1年前まではWEBの知識どころか経験もないエンジニアでした。
そんな自分が独学で勉強して現場でほぼ一人プロジェクトを経験して今、スタートアップでWEBエンジニアとして今一人で仕事を進めれるまでに至った学習ロードマップを紹介しようと思います。#前提
・エンジニアとしての経験は3年(SEとしての経験)
・WEBの経験は無し
・一年前は、プログラミングはほぼコピペばかりであまり自信がなかった
・ほぼ独学(プログラミングスクールやメンターなどは未使用)
・あくまで自分が一年前から今までどんな感じで学習してきたかを振り返る形なので参考程度に見ていただければと・・・#学習ロードマップ(実装編)
①〜④は独学
⑤〜⑦は業務
になります。##①Railsチュートリアル(2019/01~2019/02)
一番最初にやったのはRailsチュートリアルでした。
まあ
【Rails】RailsでAPIを作る`rails new –api` コマンドざっくりまとめ
## はじめに
RailsでAPIを作成するために使用する“`shell
$ rails new–api
“`
について、通常の`rails new`と**何が違うのか**ざっくりまとめました。※自分用メモです。:bow_tone1:
## 環境
“`yaml
OS: macOS Catalina 10.15.1
Ruby: 2.6.5
Rails: 6.0.2.1
“`
## 作成コマンド“`shell
$ rails new my_api –api
“``–api`を付けることで、APIに必要なファイルだけがインストールされる。
## 通常の`rails new`との違い
– ApplicationControllerが継承するのはActionController::APIになる。(※通常はActionController::Base)
– ブラウザ向けアプリケーションでで使われるミドルウェア(cookiesのサポートなど)
– ブラウザ向けアプリケーションでしか使われないモジュール
– ビュー、ヘルパー、アセットは生成されない
Vagrant + VirtualBoxでつくるRails 6系の環境構築
ここ数年Rails触ってなかったので、以前の[こちら](https://qiita.com/GenTamura84/items/0f97c117df6b1b6e8c0f)で書いたRails5系の記事を6系に更新したいと思います。
バージョンは
“`
Vagrant 2.2.6
VirtualBox 6.0.14
“`です。
## 1. VagrantとVirtualBoxをインストール
### Vagrant
以下のリンクより、利用されている端末のOSを選択して、インストーラーをダウンロードし、Vagrantをインストールしてください。
https://www.vagrantup.com/downloads.html### VirtualBox
以下のリンクより、利用されている端末のOSを選択して、インストーラーをダウンロードし、VirtualBoxをインストールしてください。
https://www.virtualbox.org/wiki/Download_Old_Builds_6_0※ 2019/12/24現在、VirtualBox 6.1だと、 `vagr
ストロングパラメータとは
# ストロングパラメータとは
paramsは情報を受け取れるとても便利なものだが、不正な情報を防ぐことができません。そんな時に使うのが「ストロングパラメータ」です。
「ストロングパラメータ」とは不要な情報を受け取らないようにしてくれるもの、セキュリティーを強化してくれるものになります。# ストロングパラメータの設定
ストロングパラメータはユーザーのログイン時などによく使用されるため、今回はログイン時を想定して設定を行いました。“` Rails:users_controller
private
def user_params
params.require(:user).permit(:name, :email, :password, :password_confirmation)
end
“`上記を設定することで、userはname、email、password、password_confirmationのデータしか受け取れないようになります。
Ha4go運用の実績と課題 2019
Ha4go の開発と運用をやっている @PharaohKJ です。この記事はチームの総意だとかそういうのじゃなく、あくまでも開発と運用を担当している私の考えていることです。いわゆるシビックテック発のプロダクトを開発・運営する現場について少しでも感じる、伝わればと思っています。
# Ha4go とは
[Ha4go by codeforkanazawa-org](http://ha4go.net/) を参照してください。一応、[Code for Kanazawa](https://github.com/codeforkanazawa-org) にリポジトリがあって開発されています。
CfKのメンバーだけではなく、 Code for Okinawa の [kimihito (kimihito)](https://github.com/kimihito) さん、Code for Japan の [halsk (Hal Seki)](https://github.com/halsk) さんにもコードのコミットをいただいて共同開発しています。
大きな役割は3つだと考えています.
– みん
Railsアプリ、EC2の本番環境でMySQLを直接いじる方法
自分の作ったアプリを本番環境で起動させた時に、エラーが出てしまうことはあると思います。
currentフォルダ内のlogを見て、エラーを発見したとしても、それがMySQLのエラーだと直接コマンド打たないと行けないので、修正が結構めんどくさいんですよね!そこで、よく使うMySQLのコマンドをまとめました!
##ログイン
“`
$ mysql -u root -p
Enter password: パスワードを入力(実際に文字は見えません)
“`##データベースの確認
“`
show databases;
“`
以下のように出てきます“`
+———————————-+
| Database |
+———————————-+
| information_schema |
| xxxxxxxxxxxxxxxxxx|
| mysql |
| perform