- 投稿日:2021-01-09T23:31:57+09:00
Rubyならメソッドにして、処理をストックしておくと効率的だなぁって話
はじめに
先日、ある企業と面談している中での気づきです。
もしかしたら、現場のエンジニアの方からしたら、当たり前のことなのかもしれませんが、まだ実務の経験もない私にとっては結構大きな気づきだったので、これを見た誰かにも同じ気づきになることを願って紹介します。よく使うコードはストックしておくということ
今の段階で、どんなコードがよく使うものなのかわからないけど、Rubyで言えば、処理をメソッド化してストックしておき、必要に応じて、コピペし、メソッドを呼び出すだけで処理を終えられるというのは、とても効率的だと感じました。
ポイントとしては、
- コメントで何の処理をしているのか記述しておく。
- メソッド化して、引数を渡すことで戻り値が返ってくるような感じ。(例えば、数値を渡したら文字列として返ってくるみたいな)
そういえば、Paizaの問題解くときに毎回新たにコード書いてたけど、何回も同じもの書いてたなぁ…
最後に
これを受けて、新たな疑問としては、
- よく使うコードとは、どういったものの処理なのかということ。
- そもそも自分で考えなくても、ネット上に転がっているのを拾ってくる作業なのか。
ということです。
何かアドバイスがあればください…
- 投稿日:2021-01-09T22:56:21+09:00
VScode上でターミナルを起動する
- 投稿日:2021-01-09T22:26:14+09:00
【Git】masterブランチを削除した世にも恐ろしい話〜答えは英語の中に〜
オリジナルアプリを作って今日で3日目。
要件定義をしっかりしたつもりだったがあれやこれやと出てきてしまい、
「あ、これもやらなきゃ」
「あれ?スペルミス」
「あれ?ここどうしたらいいんだっけ?」
こんなことの連発。
こまめにcommitしなければいけないと思いつつ作業ブランチのことをやっていて、他のブランチに戻る、そんなことを繰り返していてわけがわからなくなってしまったので、
「一度マージし終わっているブランチを削除しよう!」
そう思いついたのが地獄の始まりじゃったそうな・・・やっちゃったこと
% git branch -D master
「記事を見ながらやった。なぜこうなってしまったのかはわからない。後悔はしている。」
(プライバシー保護のため音声を加工してありますmasterブランチって消えるんですね。恐ろしいよ。
その後、下記コマンドでreflogを抽出% git reflog ⬇️⬇️⬇️以下結果⬇️⬇️⬇️ 0422208 (HEAD -> master) HEAD@{0}: checkout: moving from ユーザー管理機能 to master 444f2b7 (origin/ユーザー管理機能, ユーザー管理機能) HEAD@{1}: checkout: moving from master to ユーザー管理機能 0422208 (HEAD -> master) HEAD@{2}: checkout: moving from ユーザー管理機能 to master 444f2b7 (origin/ユーザー管理機能, ユーザー管理機能) HEAD@{3}: checkout: moving from master to ユーザー管理機能 0422208 (HEAD -> master) HEAD@{4}: checkout: moving from ユーザー管理機能 to master 444f2b7 (origin/ユーザー管理機能, ユーザー管理機能) HEAD@{5}: checkout: moving from master to ユーザー管理機能 0422208 (HEAD -> master) HEAD@{6}: checkout: moving from ユーザー管理機能 to master 〜以下略〜出てきたHEADの表示を確認し、該当の数字を入力
% git branch master HEAD@{21}
ザオリク成功。やったね!
そして時は流れ、新たなブランチでの作業が終わった時に事件は起こった。
コミット→プッシュ→
Delete Branchする前にmasterに反映されているか確認するか・・・
・・・あれ?
・・・おかしいな
・・・Fetch Origin、ん?
・・・なんでViewファイルが更新されてないんだ?
え?!他のファイルも更新されてない!なんで?!
Fetch OriginするとNewer Commmits on Remote
もうコミットされてるよ!と怒られた。
え、どこに?反映されてないんだけど・・・
確認するとこんな状態。% git branch -a * master テーブル新規作成 ユーザー管理機能 remotes/origin/master remotes/origin/テーブル新規作成 remotes/origin/ユーザー管理機能
remotesあるじゃない!なんで反映されないのかわからない。
ここで2時間ぐらいハマる。
復活の呪文がうまくいってなかったのか?あれはザオリクじゃなくてザオラルだったのか?
そんなことを考えながらどうにもこうにもうまくいかなくなってエラー文で検索をかけて出てきた英語の記事を読む。どうやらローカルリポジトリのmasterブランチにトラッキングブランチが設定されていないことで出るエラーらしい(ちょっと何言ってるかよくわかんない
リポジトリのクローンを作成することで回復するとのこと。感覚としては削除しちゃったから完全な状態でmasterブランチが復活してなかったよ!ってこと?
とりあえずやってみる。% git branch -u origin/master
これで見事にpullできるようになりました!ホッとした・・・
色々調べたんですが「-u」コマンドってどういう意味なのかわかりません。
何をしてくれているコマンドなんでしょうか?
remotes/origin/master
ってリモートブランチのことだと思ってましたけど違うんですね。
何回か読んだけどめちゃくちゃ難しい。
まだまだわからないことがいっぱい。やりがい。参照させて頂きました
https://qiita.com/forest1/items/db5ac003d310449743ca
ありがとうございました。
- 投稿日:2021-01-09T21:17:17+09:00
【Rails】アプリ新規作成--備忘録--
アプリ新規作成
作成したいディレクトリに移動してから
ターミナルrails new [アプリ名] -d mysql「-d mysql」でデータベース作成時にmysqlを指定
データベース作成
作成されたアプリのディレクトリまで移動する。
下記のコマンドで、database.ymlに記述された設定通りにデータベースが作成される。ターミナルrake db:create想定通りに作成されなければ、database.ymlを確認する。
sqliteが初期のデータベースに指定されているので、必要ならばgemにmysqlを記述し、bundle installする。参考: Railsアプリケーション開発をしよう! 〜開発の準備編〜
コントローラーの作成
ターミナルrails g controller [コントローラー名]ルーティング設定
routes.rbroot "[コントローラー名]#index"rootはurlでアクセスした時に、トップページに表示されるコントローラーとアクションを表示しています。
今回は[index]アクションを指定しています。コントローラーアクション記述
必要なアクションを記述していきます。
[コントローラー名]_controller.rbdef index endビューファイル作成
[app/views/コントローラ名/]ディレクトリが作成されれいるので、index.html.erbのファイルを作成します。
index.html.erb<p>Hello, World!</p>こちらで、railsサーバーを立ち上げて、ローカルでアクセスすると「Hello, World!」と表示されます。
テーブル作成
ターミナルrails g model [モデル名]モデルを作成すると、テーブルを作成する為のマイグレーションファイルが自動生成されます。
マイグレーションファイルを記述し、マイグレーションファイルを実行します。ターミナルrails db:migrate参考 Active Record マイグレーション
参考 RailsのMigrationに関する基本まとめ以上。
- 投稿日:2021-01-09T19:30:18+09:00
AWS Cloud9における「Oops VFS connection does not exist」というエラーと解決策について
はじめに
Railsチュートリアル第4版の第1章の開発中に発生した「Oops VFS connection does not exist」というエラー発生状況とその解決策についてです。
開発環境
- MacOS Catalina 10.15.7
- Safari 13.1.3
- AWS Cloud9
- Rails 5.1.6
- ruby 2.6.3
エラー内容
Cloud9上にてRailsサーバを起動し、プレビューよりデフォルトページを
表示しようとしたところ、以下の画像が表示される。
エラーメッセージ:「Oops VFS connection does not exist」
原因
Could9IDE起動自体にはCookieは不要だが、アプリやファイルのプレビュー機能を利用するにはCookieを有効化する必要があるらしい。
(実は「Third-party cookies disabled」というエラーメッセージが一番最初にプレビュー実行した際に出ていた。エラーメッセージはよく見ないといけないですね。)[参考]
AWSユーザガイド アプリケーションプレビューまたはファイルプレビュー通知: 「サードパーティーの Cookie を無効にしました」
https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/troubleshooting.html#troubleshooting-preview (2021年1月2日)解決策
Safariの[環境設定]>[プライバシー]タブにて「サイト越えトラッキングを防ぐ」のチェックをオフにする。デフォルトでは「オン(有効)」になっている。
ちなみに、Safariの「サイト越えトラッキングを防ぐ」のデフォルト設定はバージョン11.0から。
まとめ
「Oops VFS connection does not exist」というエラーメッセージから今回の原因にたどりつきにくかったと感じたので記事にしました。クラウドベースでの開発の際には、ブラウザ設定にも注意を払ってやる必要がありますね。
- 投稿日:2021-01-09T19:28:18+09:00
[Rails]多対多のリレーションで、カラムのペアにunique制約を付ける(最初から&後から)
駆け出しエンジニアの簡単なメモです。
間違いや誤解を招くような書き方があればご指摘いただけると幸いです。1.中間テーブル作成
ユーザー(User)が投稿(Post)をお気に入り登録できる機能を作成しよう→
postsテーブルとusersテーブルの間にbookmarksという中間テーブルを作成→rails g model Bookmark user:references post:referencesこれによりusersテーブルとpostsテーブルの両方を参照するように指定できます。
user_idとpost_idのペアを作成する事で、「お気に入り登録している」という状態を作ります。
しかしながらこの場合、user_idとpost_idのペアが重複することは有り得ません。(既にお気に入り登録している投稿に更にお気に入り登録はできない)
データベースで矛盾が生じないように、二つのペアがuniqueであることを明示する必要が有ります。2.1. unique制約を付ける(最初から)
作成されたマイグレーションファイルに追記します。
class CreateBookmarks < ActiveRecord::Migration[6.0] def change create_table :bookmarks do |t| t.references :user, null: false, foreign_key: true t.references :post, null: false, foreign_key: true t.timestamps #以下を追記 t.index [:user_id, :post_id], unique: true end end endあとはrails db:migrateすればオーケーです。
2.2 unique制約を付ける(後から)
今回メモするきっかけになったことです。
「あっやべ!付け忘れた!」となって後から追加する方法を調べました。migrationファイルを作成
rails g migration AddIndexUserIdAndPostIdToBookmarks中身を記述
class AddIndexUserIdAndPostIdToBookmarks < ActiveRecord::Migration[6.0] def change add_index :bookmarks, [:user_id, :post_id], unique: true end endとてもシンプルで簡単でした。
あとはrails db:migrateでオーケー!参考にさせていただいた記事
Ruby on RailsでDBにユニーク制約を付与する方法
Railsドキュメント
- 投稿日:2021-01-09T19:05:19+09:00
【RailsAPI】Active Storageをでファイルを保存する!
前書き
先日、業務で
RailsAPI
でActive Storage
を使う機会がありました。忘備録として、導入~設定方法~実装を解説したいと思います。
RailsAPI
の環境構築はこちらの記事から。
Active Storage
とは
Rails
にデフォルトで備わっている機能の一つです。ドキュメントによると下記のように説明されています。Active StorageとはAmazon S3、Google Cloud Storage、Microsoft Azure Storageなどの クラウドストレージサービスへのファイルのアップロードや、ファイルをActive Recordオブジェクトにアタッチする機能を提供します。
まとめると下記のようなイメージです。
Active Record
オブジェクトにファイルデータをアタッチできるAWS
,GCP
,Azure
などのクラウドストレージサービスに手軽に保存できる手軽にファイルデータを扱うのに必要な機能を提供してくれる、という感じでしょうか。
実際に
Active Storage
を使ってみるでは、以降からコード+文章で解説していきます!!
Active Storageの設定
【1】DB周りの設定
rails active_storage:installこのコマンドを実行すると2つのテーブルを作成するためのマイグレーションファイルが作成されます。
active_storage_blobs
テーブルactive_storage_attachments
テーブル内容としては下記の通り。(ちょっと変えているところがあります。)
active_storage_attachments
create_table :active_storage_attachments do |t| t.string :name, null: false t.references :record, null: false, polymorphic: true, index: false t.references :blob, null: false t.datetime :created_at, null: false t.index [ :record_type, :record_id, :name, :blob_id ], name: "index_active_storage_attachments_uniqueness", unique: true t.string :active_storage_blob_id, column: :blob_id end
active_storage_blobs
create_table :active_storage_blobs do |t| t.string :key, null: false t.string :filename, null: false t.string :content_type t.text :metadata t.bigint :byte_size, null: false t.string :checksum, null: false t.datetime :created_at, null: false t.index [ :key ], unique: true end確認したら、下記のコマンドを実行してマイグレートしてください。
rails db:migrate【2】保存先の設定をする。
config/environments/development.rb
とconfig/environments/production.rb
に下記のようなコードがデフォルトであると思います。config.active_storage.service = :localこの
:local
はconfig/storage.yml
に下記のように定義されています。config/storage.ymltest: service: Disk root: <%= Rails.root.join("tmp/storage") %> local: service: Disk root: <%= Rails.root.join("storage") %> # Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key) # amazon: # service: S3 # access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %> # secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %> # region: us-east-1 # bucket: your_own_bucket # Remember not to checkin your GCS keyfile to a repository # google: # service: GCS # project: your_project # credentials: <%= Rails.root.join("path/to/gcs.keyfile") %> # bucket: your_own_bucket # Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key) # microsoft: # service: AzureStorage # storage_account_name: your_account_name # storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %> # container: your_container_name # mirror: # service: Mirror # primary: local # mirrors: [ amazon, google, microsoft ]この
local
の部分にどこに保存されるか定義されています。デフォルトでは、Disk
に保存されるようになっていますね。ちなみに、S3
などのクラウドストレージサービスに保存させる場合には、このconfig/storage.yml
に諸々の設定を書き込めばOKです。設定は以上です。次から実際の使い方について見ていきます!
Active Storageを実際に使ってみる
基本的な使い方は下記のような感じです。
post.rbclass Post < ApplicationRecord has_one_attached :image end上記のようにモデル層に、ファイル情報をアタッチすることでPostモデルがファイル情報を持っているように挙動してくれます。
コントローラ側では以下のような感じです。
posts_controller.rbclass PostsController < ApplicationController def create post = Post.new(post_params) if post.save render json: post else render json: post.errors, status: 422 end end def post_params params.permit(:name, :image) end end
post
モデルがimage
カラムを持っているように動いてくれていますね。基本的な使い方は以上です。次から
Active Storage
の詳細な機能について解説していきます。保存済みのファイルのURLを返す
最初に設定として
config/environments/development.rb
にコードを追加します。config/environments/development.rbRails.application.configure do ... # 下記のコードを追加 Rails.application.routes.default_url_options[:host] = 'localhost' Rails.application.routes.default_url_options[:port] = 3000 endそして、該当するモデルで下記のようにしてください。
post.rbclass Post < ApplicationRecord # ここから include Rails.application.routes.url_helpers # ここまでを追加してください。 has_one_attached :image # ここから def image_url image.attached? ? url_for(image) : nil end # ここまで追加してください。 end
url_for
メソッドを使うためにRails.application.routes.url_helpers
をincludeしてください。image_url
メソッドでは、画像のURLを返しています。ちなみに
url_for(image)の部分について少し補足しておきます。
アクセスした時には、実際のサービスエンドポイントへのリダイレクトが返されます。なので公開されるURLと実際のURLを切り離すことができます。すごく便利ですね。
準備はこれで完了です。コントローラでは以下のように書けば、URLを出力することできます。
posts_controller.rbclass PostsController < ApplicationController # 下記のアクションを追加 def index render json: Post.all, methods: [:image_url] end def create post = Post.new(post_params) if post.save render json: post else render json: post.errors, status: 422 end end def post_params params.permit(:name, :image) end end
methods: [:image_url]
の部分で、メソッドの結果をjson
で出力することができます。(実際には、こんな感じには書かずに僕だったらシリアライザーで整形します。)URLに関しては以上です。
複数のファイルをアタッチしたい
この場合はモデルで
has_many_attached
のように宣言してあげれば、複数のファイルをアタッチすることができます。実際には下記のようなイメージです。post.rbclass Post < ApplicationRecord include Rails.application.routes.url_helpers has_many_attached :images def image_url image.attached? ? url_for(image) : nil end end基本的な使い方に関しては以上です。あとはドキュメントを読み込んでいくとさらに知識がつくかなと思います。
ではでは?
- 投稿日:2021-01-09T15:27:48+09:00
rubyの「||=」の仕様を理解と、Railsのpresenceメソッドとは
なにこれ
筆者が
||=
の扱いでずっこけたので、備忘録として書いてます。
presenceメソッドの解説(?)もしてるので、良かったら見てください!
ご指摘があればコメント欄までお願いいたします。そもそも「||=」とは
簡単に言うと自己代入
rubyでよく見る下記のコードと同じ意味result = 1 result += 2 p result #=> 3これを「もしnil or falseだったら、右辺を代入する」に変えたバージョン。
def check(arg) arg ||= 'nil or false' p arg end check('hoge') #=> 'hoge' check(nil) #=> 'nil or false' check(false) #=> 'nil or false'||= の詳しい動き
Rubyのドキュメントに素晴らしいサンプルコードがあったので、抜粋します
p obj.foo ||= true p obj.foo || (obj.foo = true)まさに上記と同じ動きをしています。
||
で比較をする。||
は最初に真になったものを返す。
obj.foo
がnil or falseじゃなければ真つまり左辺を返す。
左辺が偽なら、左辺の変数に対して右辺のコードを代入する。ということです。筆者がハマった罠(余談)
上記のnil or falseだったら左辺に代入するという仕様を理解できてなかったせいで、
若干沼ったので備忘録として残します。
この記事を書こうとした理由でもあります。Railsで開発してて、次の要件を満たすメソッドを作りたかった。
・DBから指定したidかつboolean型がtrueのレコードを取得する
・取得したレコードのboolean型をfalseにしてupdateする・必ずレコードが存在するとは限らない。
・条件に一致したレコードが取得できなければreturnする下記のようなコードを書きました(変数名は仮)
def find_and_change_default(post_id) post = Post.find_by(id: post_id, boolean: true) if post.present? post.update(boolean: false) end end1つ問題として思ったのが
「postをfind_byしたのにpresent?で存在確認するって冗長じゃね?」
と、思いました。そこで色々調べたところ、Railsのpresenceメソッドを知って、下記のように修正しました
def find_and_change_default(post_id) post = Post.find_by(id: post_id, boolean: true).presence || return post.update(boolean: false) endpresneceメソッドはRailsで次のように定義されてます。
activesupport/lib/active_support/core_ext/object/blank.rbdef presence self if present? endレシーバ(今回はpost)がpresent?でtrueが返されれば、selfを返します。
Railsガイドに下記のような用法が紹介されてました。host = config[:host].presence || 'localhost'configにhostがあれば、そちらを代入。なければlocalhostを代入する。というコードです。
「||=」とpresenceメソッドの関係性
ここを一番説明したかった。今までは前座です
||=
の左辺がnil or falseなら右辺を代入する。という仕様を理解してなくて起こった悲劇です。nilだったらreturnするから、
||=
が使えそう!と何故か思ってしまい、
こんなコードを書いてしまいましたpost = Post.find_by(id: post_id, boolean: true).presence ||= return #=> undefined method `presence=' for nil:NilClass (NoMethodError)上記は一致するレコードがなかった時の結果です。
エラーを吐いた時は頭を抱えましたが、rubyのドキュメントを100回確認したら理解できました。
https://docs.ruby-lang.org/ja/latest/doc/spec=2foperator.html用法を調べたら、Railsに下記のようなコードがありました(メソッドはRailsのコードから適当に抜粋しました)
def open_connection(server = nil) server ||= TestServer.new # 後続の処理 end引数にとった値を確認する時に使うのが一般的だと思いました。
さっきの場合は、DBからデータを取得して変数に格納したいのに、左辺に代入するという意味が分かってなくて、
上記のようなコードを書いてしまいました。
nil.presence
メソッドを実行してる左辺に対してreturnを代入するって、もはやメチャクチャですね
- 投稿日:2021-01-09T14:31:32+09:00
Railsを辞めたい人にこそ伝えたいRailsのビューコンポーネント化の概念
はじめに
- これはエンジニア初心者(特にRailsエンジニア)向けの記事です
- ビューコンポーネント化という昨今流行りの概念をRailsで説明します
- Railsはオワコンってあちこちで言われてて悲しいのでReact/Vue/Nextに移ろうという人向けに背中を押す
コンポーネント化って何ですか
コンポーネント化の技術に優れたエンジニアは優れています。
優れたエンジニアを目指すために、コンポーネント化とは何なのか知っておきましょう。コンポーネント化とはコードやファイルを再利用可能な部品として分割することを言います。
そして、コンポーネント化をするメリットは、コードの可読性が上がることです。なぜコードの可読性をあげる必要があるのですか
エンジニアは突然死ぬからです。
昨日「お疲れ様でした〜」と何気なく別れた開発メンバーが
明日も元気に顔を出すとは限りません。そして、大きなプロジェクトほどメンバーが欠けた際のインパクトは大きいです。
あなたが一生懸命書いたコードが残っていても、そのコードの可読性が低ければ、
極論、そのプロジェクトはやり直しや中止になるかもしれません。労働というのは実に人生の1/3を占めると言われています。
私たちエンジニアの仕事の成果は私たちが書いたコードでありますから、
それが無駄になるということは避けたいわけです。したがって、可読性の高いコードを書くことは人生の質QuallityOfLifeそのものを向上させます。
Railsのビューコンポーネントにはrenderを使おう
Railsにはrenderという大変便利なヘルパーメソッドが用意されています。renderを使うと、巷で話題のReactやVueやらが得意とするビューのコンポーネント化がお手の物です。
renderメソッドは以下の文法によって使えます。
render "ファイル名", 引数, 引数, ...他にもいくつか指定できるオプションが存在するのですが、ことコンポーネント化について語る文面のうえでその知識は必要ありません。ひとまず、第一引数にはファイル名、それ以降は引数であると覚えておきましょう。
それでは実際にrenderを使うことで何ができるのか見ていきましょう。今から作成するのは、以下の様な簡単なビュー表示です。Twitterのサイドバーを作る様なイメージとなります。
それでは、renderを使わなかった場合のアンチパターンを以下に示します。ハンズオンで学びたい方は、TailwindCSSを導入したRails6アプリケーションを作成のうえ、以下を任意のビューファイルにコピペして下さい。hoge.html.erb<div class="wrapper flex h-screen text-gray-800"> <div class="sidebar w-1/5 bg-gray-200 p-8"> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-home"></i> <span class="pl-4">ホーム</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-hashtag"></i> <span class="pl-4">話題を検索</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-bell"></i> <span class="pl-4">通知</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-envelope"></i> <span class="pl-4">メッセージ</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-bookmark"></i> <span class="pl-4">ブックマーク</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-list-alt"></i> <span class="pl-4">リスト</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-user"></i> <span class="pl-4">プロフィール</span> </div> </div> <div class="body w-4/5 bg-gray-100"></div> </div>アンチパターンとは言いましたが、ごく普通に設計されたビューファイルです。しかしながら、
<div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-home"></i> <span class="pl-4">ホーム</span> </div>といった部分が何度も繰り返されており、所謂DRY(Don't Repeat Yourself)原則というプログラミング界の通説に反しているわけです。
では、続いてrenderを使った場合のコードを確認してみましょう。
hoge.html.erb<div class="wrapper flex h-screen text-gray-800"> <div class="sidebar w-1/5 bg-gray-200 p-8"> <%= render "articles/templates/sidebarContent", icon:"home" , text:"ホーム"%> <%= render "articles/templates/sidebarContent", icon:"hashtag" , text:"話題を検索"%> <%= render "articles/templates/sidebarContent", icon:"bell" , text:"通知"%> <%= render "articles/templates/sidebarContent", icon:"envelope", text:"メッセージ"%> <%= render "articles/templates/sidebarContent", icon:"bookmark", text:"ブックマーク"%> <%= render "articles/templates/sidebarContent", icon:"list-alt", text:"リスト"%> <%= render "articles/templates/sidebarContent", icon:"user" , text:"プロフィール"%> </div> <div class="body w-4/5 bg-gray-100"></div> </div>articles/templates/_sidebarContent.html.erb<div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-<%= icon %>"></i> <span class="pl-4"><%= text %></span> </div>かなりスリムなコードに生まれ変わりました。
もう一度renderの使い方を確認しておきましょう。render "ファイル名", 引数, 引数, ...引数はキーハッシュの形式で与えています。
キーハッシュというのは名前を付けることのできる変数のことです。今回、fontawesomeのアイコン名がサイドバーの子項目ごとに違っていたので、まずはこれを
icon
という名前でrenderメソッドの第2引数に与えているわけです。また、表示されているテキストも子項目ごとに異なりますから、こちらはtext
という名前で第3引数に与えてやったわけです。あとはこれらの引数たちをテンプレート(切り出された側のファイルのこと。今回はつまり
_sidebarContent.html.erb
のことです)内でERBタグ(<%= %>
みたいなタグのことです)を使って呼び出せばいいわけです。よって<i class="fa fa-<%= icon %>"></i> <span class="pl-4"><%= text %></span>となるわけです。上記をもって「Railsでビューのコンポーネント化」ができました。
こんな感じで、コンポーネント化しておくことで、コードが大変読みやすい上に、
新しい子項目を追加するのも非常に楽な良いコードを書くことができましたね。まとめ
- renderメソッドを使えばRailsでビューのコンポーネント化が可能
render "ファイル名", 引数, 引数
という形式で使おうコンポーネント化の概念を習得しておけば、Railsが真にオワコンになったとしても他のJavaScript系技術を学習する際に役立つこと間違いなしです。是非習得しておきましょう!
筆者連絡先
- 投稿日:2021-01-09T14:31:32+09:00
Rails辞めたい人にこそ伝えたいRailsのビューコンポーネント化の概念
はじめに
- これはエンジニア初心者(特にRailsエンジニア)向けの記事です
- ビューコンポーネント化という昨今流行りの概念をRailsで説明します
- Railsはオワコンってあちこちで言われてて悲しいのでReact/Vue/Nextに移ろうという人向けに背中を押す
コンポーネント化って何ですか
コンポーネント化の技術に優れたエンジニアは優れています。
優れたエンジニアを目指すために、コンポーネント化とは何なのか知っておきましょう。コンポーネント化とはコードやファイルを再利用可能な部品として分割することを言います。
そして、コンポーネント化をするメリットは、コードの可読性が上がることです。なぜコードの可読性をあげる必要があるのですか
エンジニアは突然死ぬからです。
昨日「お疲れ様でした〜」と何気なく別れた開発メンバーが
明日も元気に顔を出すとは限りません。そして、大きなプロジェクトほどメンバーが欠けた際のインパクトは大きいです。
あなたが一生懸命書いたコードが残っていても、そのコードの可読性が低ければ、
極論、そのプロジェクトはやり直しや中止になるかもしれません。労働というのは実に人生の1/3を占めると言われています。
私たちエンジニアの仕事の成果は私たちが書いたコードでありますから、
それが無駄になるということは避けたいわけです。したがって、可読性の高いコードを書くことは人生の質QuallityOfLifeそのものを向上させます。
Railsのビューコンポーネントにはrenderを使おう
Railsにはrenderという大変便利なヘルパーメソッドが用意されています。renderを使うと、巷で話題のReactやVueやらが得意とするビューのコンポーネント化がお手の物です。
renderメソッドは以下の文法によって使えます。
render "ファイル名", 引数, 引数, ...他にもいくつか指定できるオプションが存在するのですが、ことコンポーネント化について語る文面のうえでその知識は必要ありません。ひとまず、第一引数にはファイル名、それ以降は引数であると覚えておきましょう。
それでは実際にrenderを使うことで何ができるのか見ていきましょう。今から作成するのは、以下の様な簡単なビュー表示です。Twitterのサイドバーを作る様なイメージとなります。
それでは、renderを使わなかった場合のアンチパターンを以下に示します。ハンズオンで学びたい方は、TailwindCSSを導入したRails6アプリケーションを作成のうえ、以下を任意のビューファイルにコピペして下さい。hoge.html.erb<div class="wrapper flex h-screen text-gray-800"> <div class="sidebar w-1/5 bg-gray-200 p-8"> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-home"></i> <span class="pl-4">ホーム</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-hashtag"></i> <span class="pl-4">話題を検索</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-bell"></i> <span class="pl-4">通知</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-envelope"></i> <span class="pl-4">メッセージ</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-bookmark"></i> <span class="pl-4">ブックマーク</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-list-alt"></i> <span class="pl-4">リスト</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-user"></i> <span class="pl-4">プロフィール</span> </div> </div> <div class="body w-4/5 bg-gray-100"></div> </div>アンチパターンとは言いましたが、ごく普通に設計されたビューファイルです。しかしながら、
<div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-home"></i> <span class="pl-4">ホーム</span> </div>といった部分が何度も繰り返されており、所謂DRY(Don't Repeat Yourself)原則というプログラミング界の通説に反しているわけです。
では、続いてrenderを使った場合のコードを確認してみましょう。
hoge.html.erb<div class="wrapper flex h-screen text-gray-800"> <div class="sidebar w-1/5 bg-gray-200 p-8"> <%= render "articles/templates/sidebarContent", icon:"home" , text:"ホーム"%> <%= render "articles/templates/sidebarContent", icon:"hashtag" , text:"話題を検索"%> <%= render "articles/templates/sidebarContent", icon:"bell" , text:"通知"%> <%= render "articles/templates/sidebarContent", icon:"envelope", text:"メッセージ"%> <%= render "articles/templates/sidebarContent", icon:"bookmark", text:"ブックマーク"%> <%= render "articles/templates/sidebarContent", icon:"list-alt", text:"リスト"%> <%= render "articles/templates/sidebarContent", icon:"user" , text:"プロフィール"%> </div> <div class="body w-4/5 bg-gray-100"></div> </div>articles/templates/_sidebarContent.html.erb<div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-<%= icon %>"></i> <span class="pl-4"><%= text %></span> </div>かなりスリムなコードに生まれ変わりました。
もう一度renderの使い方を確認しておきましょう。render "ファイル名", 引数, 引数, ...引数はキーハッシュの形式で与えています。
キーハッシュというのは名前を付けることのできる変数のことです。今回、fontawesomeのアイコン名がサイドバーの子項目ごとに違っていたので、まずはこれを
icon
という名前でrenderメソッドの第2引数に与えているわけです。また、表示されているテキストも子項目ごとに異なりますから、こちらはtext
という名前で第3引数に与えてやったわけです。あとはこれらの引数たちをテンプレート(切り出された側のファイルのこと。今回はつまり
_sidebarContent.html.erb
のことです)内でERBタグ(<%= %>
みたいなタグのことです)を使って呼び出せばいいわけです。よって<i class="fa fa-<%= icon %>"></i> <span class="pl-4"><%= text %></span>となるわけです。上記をもって「Railsでビューのコンポーネント化」ができました。
こんな感じで、コンポーネント化しておくことで、コードが大変読みやすい上に、
新しい子項目を追加するのも非常に楽な良いコードを書くことができましたね。まとめ
- renderメソッドを使えばRailsでビューのコンポーネント化が可能
render "ファイル名", 引数, 引数
という形式で使おうコンポーネント化の概念を習得しておけば、Railsが真にオワコンになったとしても他のJavaScript系技術を学習する際に役立つこと間違いなしです。是非習得しておきましょう!
筆者連絡先
- 投稿日:2021-01-09T14:31:32+09:00
【初心者に伝えたい】RailsでDon't Repeat Yourself【ビューコンポーネント化の概念】
はじめに
- これはエンジニア初心者(特にRailsエンジニア)向けの記事です
- ビューコンポーネント化という昨今流行りの概念をRailsで説明します
- Railsはオワコンってあちこちで言われてて悲しいのでReact/Vue/Nextに移ろうという人向けに背中を押す
コンポーネント化って何ですか
コンポーネント化の技術に優れたエンジニアは優れています。
優れたエンジニアを目指すために、コンポーネント化とは何なのか知っておきましょう。コンポーネント化とはコードやファイルを再利用可能な部品として分割することを言います。
そして、コンポーネント化をするメリットは、コードの可読性が上がることです。なぜコードの可読性をあげる必要があるのですか
エンジニアは突然死ぬからです。
昨日「お疲れ様でした〜」と何気なく別れた開発メンバーが
明日も元気に顔を出すとは限りません。そして、大きなプロジェクトほどメンバーが欠けた際のインパクトは大きいです。
あなたが一生懸命書いたコードが残っていても、そのコードの可読性が低ければ、
極論、そのプロジェクトはやり直しや中止になるかもしれません。労働というのは実に人生の1/3を占めると言われています。
私たちエンジニアの仕事の成果は私たちが書いたコードでありますから、
それが無駄になるということは避けたいわけです。したがって、可読性の高いコードを書くことは人生の質そのものを向上させます。
Railsのビューコンポーネントにはrenderを使おう
Railsにはrenderという大変便利なヘルパーメソッドが用意されています。renderを使うと、巷で話題のReactやVueやらが得意とするビューのコンポーネント化がお手の物です。
renderメソッドは以下の文法によって使えます。
render "ファイル名", 引数, 引数, ...他にもいくつか指定できるオプションが存在するのですが、ことコンポーネント化について語る文面のうえでその知識は必要ありません。ひとまず、第一引数にはファイル名、それ以降は引数であると覚えておきましょう。
それでは実際にrenderを使うことで何ができるのか見ていきましょう。今から作成するのは、以下の様な簡単なビュー表示です。Twitterのサイドバーを作る様なイメージとなります。
それでは、renderを使わなかった場合のアンチパターンを以下に示します。ハンズオンで学びたい方は、TailwindCSSを導入したRails6アプリケーションを作成のうえ、以下を任意のビューファイルにコピペして下さい。hoge.html.erb<div class="wrapper flex h-screen text-gray-800"> <div class="sidebar w-1/5 bg-gray-200 p-8"> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-home"></i> <span class="pl-4">ホーム</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-hashtag"></i> <span class="pl-4">話題を検索</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-bell"></i> <span class="pl-4">通知</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-envelope"></i> <span class="pl-4">メッセージ</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-bookmark"></i> <span class="pl-4">ブックマーク</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-list-alt"></i> <span class="pl-4">リスト</span> </div> <div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-user"></i> <span class="pl-4">プロフィール</span> </div> </div> <div class="body w-4/5 bg-gray-100"></div> </div>アンチパターンとは言いましたが、ごく普通に設計されたビューファイルです。しかしながら、
<div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-home"></i> <span class="pl-4">ホーム</span> </div>といった部分が何度も繰り返されており、所謂DRY(Don't Repeat Yourself)原則というプログラミング界の通説に反しているわけです。
では、続いてrenderを使った場合のコードを確認してみましょう。
hoge.html.erb<div class="wrapper flex h-screen text-gray-800"> <div class="sidebar w-1/5 bg-gray-200 p-8"> <%= render "articles/templates/sidebarContent", icon:"home" , text:"ホーム"%> <%= render "articles/templates/sidebarContent", icon:"hashtag" , text:"話題を検索"%> <%= render "articles/templates/sidebarContent", icon:"bell" , text:"通知"%> <%= render "articles/templates/sidebarContent", icon:"envelope", text:"メッセージ"%> <%= render "articles/templates/sidebarContent", icon:"bookmark", text:"ブックマーク"%> <%= render "articles/templates/sidebarContent", icon:"list-alt", text:"リスト"%> <%= render "articles/templates/sidebarContent", icon:"user" , text:"プロフィール"%> </div> <div class="body w-4/5 bg-gray-100"></div> </div>articles/templates/_sidebarContent.html.erb<div class="sidebar-content h-12 bg-gray-300 items-center flex pl-4 mb-4"> <i class="fa fa-<%= icon %>"></i> <span class="pl-4"><%= text %></span> </div>かなりスリムなコードに生まれ変わりました。
もう一度renderの使い方を確認しておきましょう。render "ファイル名", 引数, 引数, ...引数はキーハッシュの形式で与えています。
キーハッシュというのは名前を付けることのできる変数のことです。今回、fontawesomeのアイコン名がサイドバーの子項目ごとに違っていたので、まずはこれを
icon
という名前でrenderメソッドの第2引数に与えているわけです。また、表示されているテキストも子項目ごとに異なりますから、こちらはtext
という名前で第3引数に与えてやったわけです。あとはこれらの引数たちをテンプレート(切り出された側のファイルのこと。今回はつまり
_sidebarContent.html.erb
のことです)内でERBタグ(<%= %>
みたいなタグのことです)を使って呼び出せばいいわけです。よって<i class="fa fa-<%= icon %>"></i> <span class="pl-4"><%= text %></span>となるわけです。上記をもって「Railsでビューのコンポーネント化」ができました。
こんな感じで、コンポーネント化しておくことで、コードが大変読みやすい上に、
新しい子項目を追加するのも非常に楽な良いコードを書くことができましたね。まとめ
- renderメソッドを使えばRailsでビューのコンポーネント化が可能
render "ファイル名", 引数, 引数
という形式で使おうコンポーネント化の概念を習得しておけば、Railsが真にオワコンになったとしても他のJavaScript系技術を学習する際に役立つこと間違いなしです。是非習得しておきましょう!
筆者連絡先
- 投稿日:2021-01-09T13:02:05+09:00
【Railsトリビア】blog_path(@ blog)の代わりにblog_pathと書いても自動的にidが補完される
たとえば、RailsのViewファイルとして次のような
blogs/edit.html.erb
があったとします。<h1>Editing Blog</h1> <%= render 'form', blog: @blog %> <%= link_to 'Show', blog_path(@blog) %> | <%= link_to 'Back', blogs_path %>5行目の
blog_path(@blog)
は/blogs/10
のようなパスを生成するヘルパーメソッドです。(ここでは@blog.id
の値が10だった場合を想定)このように
blog_path
の引数には通常、@blog
のようなActiveRecordのインスタンスを渡すと思います。
ですが、blog_path
は次のように引数無しで呼びだしてもエラーにはなりません。<%= link_to 'Show', blog_path %> |生成されるパスは先ほどと同じく
/blogs/10
になります。Viewだけでなく、コントローラ内でも同様です。
def update if @blog.update(blog_params) # blog_path(@blog) と書かなくても /blogs/10 にリダイレクトされる redirect_to blog_path, notice: '...' else render :edit end endWhy?
上記のような編集画面は通常、以下のようなパス(URL)で呼び出されると思います。
/blogs/10/edit
blog_path
のように引数無しでヘルパーメソッドを呼び出した場合、リクエスト時のパスに含まれるid(ここでは10)を引き継いで/blogs/10
が生成されます。引数がないとエラーになるケース
rails consoleなどで
app.blog_path
と書いた場合は引き継ぐidがないのでエラーになります。> app.blog_path Traceback (most recent call last): 1: from (irb):2 ActionController::UrlGenerationError (No route matches {:action=>"show", :controller=>"blogs"}, missing required keys: [:id]) Did you mean? blog_url blogs_url blogs_path new_blog_url引数無しの
blog_path
を使うのはアリか、ナシか?個人的にはナシだと思います。
暗黙的にidが決まってしまうより、明示的に「このメソッドで生成したいパスはこのid(このオブジェクト)」ということを示すために
blog_path(@blog)
のように書く方が安全だからです。また、引数を省略するクセが付いていると、Viewのロジックによっては意図しないidでパスが生成されたりして思わぬ不具合を起こすかもしれません。
ドキュメントはどこ?
url_for
メソッドのドキュメントにそれらしき記述がありました。https://edgeapi.rubyonrails.org/classes/ActionDispatch/Routing/UrlFor.html#method-i-url_for
Missing routes keys may be filled in from the current request's parameters (e.g.
:controller
,:action
,:id
and any other parameters that are placed in the path).(筆者訳) 不足しているルーティングのキーは、リクエストパラメータ(例
:controller
や、:action
、:id
、その他パスに含まれる各種パラメータ)から取得されます。上のドキュメントに書いてあるとおり、たとえば
blog_path
の代わりにurl_for(controller: 'blogs', action: 'show')
のように書いても同じように/blogs/10
が生成されます。(もっと言えばurl_for(action: 'show')
だけでもOK)確認したバージョン
- Rails 6.0.3.3
- 投稿日:2021-01-09T12:37:46+09:00
GitとGitHub 〜よくあるエラーの解消方法〜
プログラミング学習の備忘録としてアップします。
目的
- Switch Branchの使用方法を理解する
- コンフリクトが起こる操作ミスを学ぶ
- 簡単なコンフリクトの解消方法を学ぶこと
- revertの使用方法を理解する
- Switch Branchの使用方法を理解する
内容
Switch Branchの使用方法を理解する
ブランチを作成し忘れたときや、別のブランチに書き込んでしまった場合、ブランチを元に戻すには
1.書いているコードを別のブランチに引き継ぐか、 →Bring Change To
2.書いているコードを一旦保留して0からブランチを作り直すか →Leave On Change My Master
Leave On Change My Master
一旦作業を中断したいときなどに用いる操作、0からブランチを作成するため作業内容が0に戻ってしまう。中断した作業を元に戻すには
マスターブランチに戻る
Started Changes を選択する
Resteore を選択する
ことでコードを復旧する
コンフリクトが起こる操作ミスを学ぶ
コンフリクト 複数人が各々のブランチで作業し、マスターブランチにPushする際、それぞれが同じファイルを編集してしまった場合、AにはIndexがありNewがないBにはIndexがなくNewgがあるといった辻褄が合わない状態が生じる。簡単なコンフリクトの解消方法を学ぶこと
間違った情報をPushしてしまった場合

上記画面のResolve conflictを選択
コードをあるべき内容に修正する
Mark As Resolved を選択
上記をそれぞれに行う。
コンフリクトが起こった際の注意点
・別々に作業を始める前に、打ち合わせを行い事前にコンフリクト になりそうな箇所を押さえておく
・最新のマスターブランチの情報をpullしてから作業に取り掛かること
・なぜコンフリクトが発生したかを明確化すること
・コンフリクトの解消は独断で行わず、メンバーと打ち合わせて解消するrevertの使用方法を理解すること
間違った情報をpushしてしまった場合
一度リモートディポジトリにpushしたcomment情報は戻すことはできない。注意してpushすること。
戻すことはできないが、リモートディポジトリのcommitは削除できる。→Revert
・Historyの中にあるcommit一覧の中の削除したいものを選択し右クリック
「Revert Changes In commit」を行う
push Origin間違った情報をcommentしてしまった場合
pushする前であれば、commentの下にあるUn doでコメントは取り消せる総括
複数人で作業をする際には個人のエラーが全体のエラーにつながってしまう。
・push・comment等をする際にはエラーがないことを確認して行う。
・間違えてしまったら正しい手順で解消し、チームメンバーには相談、報告を行う。
・解決できない時は分で解消しようとしないでメンバーに相談する。
- 投稿日:2021-01-09T11:55:04+09:00
メソッド
メソッドとは
一言で言えば処理をまとめて使えるようにするものです。
これだけでは意味がわからないと思うので実際にコードを書いていきますこんにちはと出力する hello というメソッドを定義したいとします。
def hello #メソッドを定義するときはdefで始めてendで終わる puts "こんにちは" end hello #メソッドの呼び出し こんにちは #helloで定義したこんにちはが出力される戻り値
メソッドは最後の行が戻り値となります。
def number "1" "2" "3" end puts number 3 #最後の3が出力returnを入力すると処理が途中でとまります。
def number "1" return "2" "3" end puts number 2 #途中の2が出力以上です。
- 投稿日:2021-01-09T10:20:33+09:00
【Ruby】rqr_codeでundefined method `dark?'が発生する
課題
既存の記事を参考にrqr_codeを利用したら undefined method `dark?' が出た。
再現手順
rqr_codeのインストール$ gem install rqrcode_png基本コードの丸写しrequire 'rqrcode' require 'rqrcode_png' require 'chunky_png' qr = RQRCode::QRCode.new( "Hello World!!", size: 3, level: :h) img = qr.to_img img.resize(200, 200).save("hello_world.png")実行エラー$ ruby qr_code.rb Traceback (most recent call last): <中略> rqrcode_png/sequence.rb:11:in `block (2 levels) in dark_squares_only': undefined method `dark?' for #<RQRCode::QRCode:0x00007f9126021200> (NoMethodError)結論
.to_imgでは無く.as_pngで回避できた。
.to_imgを.as_pngに変更require 'rqrcode' require 'rqrcode_png' require 'chunky_png' qr = RQRCode::QRCode.new( "Hello World!!", size: 3, level: :h) # img = qr.to_img img = qr.as_png img.resize(200, 200).save("hello_world.png")参考情報
[Ruby]QRコードの生成、埋め込み
https://qiita.com/koteko/items/d6d033997c544c47b718Rubyで簡単にQRコード画像を生成する方法
https://qiita.com/sakaitaka/items/c753103c93fa177e4466
- 投稿日:2021-01-09T06:03:31+09:00
何も知らない私が独学で3日間ruby on rails勉強しながらTODOを作ってみた
はじめに
どうやって私がruby on railsを勉強したのかについて詳しく説明します!
なぜrubyを勉強したのか?
日本でrubyを使うことがあると聞きました。
いつかrubyプロジェクトに出会いそうで勉強を始めました。rubyを勉強した方法
https://www.tutorialspoint.com/ruby/index.htm
上リンクにある例をすべて確認しました。
重要なポイントだけ実行しながら勉強しました!
わからないことが出てきたら後で参考にすることにしました。# variable and operate num1 = 10 num2 = 20 result = num1 + num2 # print string puts "result is #{result}" # if else condition if result > 10 puts "result > 10" else puts "else condition" end # loop # start <= n <= end for n in 1..5 puts "#{n}" end # array (list) arr = [1, 2, 3] for n in arr puts "#{n}" end # hash (dict) hash = Hash[ "a" => 100, "b" => 200 ] puts "#{hash['a']}" puts "#{hash['b']}" # block def helloworld puts "hello world" end helloworld() def add(num1, num2) puts "sum is #{num1 + num2}" end add(5,8)railsを勉強した方法
https://guides.rubyonrails.org/getting_started.html
上リンクにある例を部分的に参考にしました。
railsをインストールする
gem install railsrailsがよくインストールできたのか確認する
rails --version Rails 6.1.0プロジェクトを作る
rails new todooptionを見る
rails s --helpサーバーを実行する
rails smysqlを作る
docker-compose.yml
version: '3' services: db: image: mysql:8.0 container_name: mysql environment: MYSQL_ROOT_PASSWORD: root MYSQL_DATABASE: todo MYSQL_USER: docker MYSQL_PASSWORD: docker TZ: 'Asia/Tokyo' command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ports: - 3306:3306docker-compose up -ddockerを利用して簡単にmysqlを作りました:)
勉強しながら出会った最悪の問題
https://rubyinstaller.org/downloads/
上記のリンクからrubyをダウンロードしました。
ruby --version ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x64-mingw32] gem --version 3.2.3最初は全然わからなかったです。
windows10でrubyを使うのはダメだったこと…mysqlと繋ぐとき問題に出会いました。
問題1
Puma caught this error: Error loading the 'mysql2' Active Record adapter. Missing a gem it depends on? mysql2 is not part of the bundle. Add it to your Gemfile. (LoadError)問題1解決
Gemfileにしたのコードを追加
gem 'mysql2'bundle install問題2
Gem::Ext::BuildError: ERROR: Failed to build gem native extension. ... Cannot find include dir(s) C:\Users\dev\mysql-connector-c-noinstall-6.0.2-win32/include/include問題2解決
bundle config --local build.mysql2 "--with-mysql-dir=C:\Users\dev\mysql-connector-c-noinstall-6.0.2-win32"bundle install問題3
client.c:1350:38: error: 'MYSQL_DEFAULT_AUTH' undeclared (first use in this function); did you mean 'MYSQL_SECURE_AUTH'? 1350 | return _mysql_client_options(self, MYSQL_DEFAULT_AUTH, value); | ^~~~~~~~~~~~~~~~~~ | MYSQL_SECURE_AUTH問題3解決
Gemfileにしたのコードに修正
gem 'mysql2', '~> 0.4.10'問題4
C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/bootsnap-1.5.1/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require': cannot load such file -- Win32API (LoadError) Did you mean? win32/sspiここで諦めました…
たくさん調べて分かりましたが
皆WSLを使う事実を分かりました。
ここからはWSLでプログラミングしましたWSLとは?
https://qiita.com/Brutus/items/f26af71d3cc6f50d1640
WSLに関する詳細は上記リンクを参照してください
WSLを利用してruby on railsとmysqlを繋ぎました。
dependencyをインストール
sudo apt-get update sudo apt-get install autoconf bison build-essential libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-devrbenvをインストール
git clone https://github.com/rbenv/rbenv.git ~/.rbenv git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-buildrbenvをセッティング
vi ~/.bashrcexport PATH=$PATH:$HOME/.rbenv/bin eval "$(rbenv init -)"source ~/.bashrcrubyをセッティング
rbenv --version rbenv install --list rbenv install 3.0.0 rbenv versions rbenv global 3.0.0 rbenv versionsdb dependencyをインストール
sudo apt-get install libsqlite3-dev sudo apt install libmysqlclient-devGemfileに下のコードを追加
gem 'mysql2'bundleをインストール
bundle installこれでmysqlと繋ぐことができました。
一つずつゆっくりプログラミング
htmlをレンダリングするために最初にしなければならないことはcontrollerを作ることでした。
rails generate controller Todo index --skip-routeshtmlレンダリングを確認した後、コードを一生懸命作成しました。
その後、モデルを簡単に作ってmysqlでカラムを修正しました。
rails generate model Todo content:stringrails generate model User username:stringrails db:migratecontents table
users table
rails session が保存できない問題
GET METHODでsessionを保存してGET METHODでsessionを呼び込んだら作動する。
GET METHODでsessionを保存してPOST METHODでsessionを呼び込んだら作動しない。sessionがPOST METHODを使うとき保存できない問題の原因
https://stackoverflow.com/questions/18422182/rails-sessions-not-saving
csrf tokenが一致しなければsessionが初期化されることが分かりました。
csrf token問題解決方法
https://qiita.com/naberina/items/d3b14521e78e0daccdcd
csrf tokenを正常に送る方法が胃リンクで分かりました。
結果
色んな問題を乗り越えて3日たって完成することができました!!
最初はデザインもダサいです。
機能を作ることに集中しました。
その後bootstrapのbreak pointとspaceを利用して反応型ウェブを作りました。
デザインも修正してtoastrライブラリーも追加しました。最後にログインを勉強するためにsessionを利用した機能を作りました。
ユーザーを変更するuiはslick.jsを使いました。github
https://github.com/h4ppyy/ror-todo
まとめ
ウェブ勉強の場合TODOを作ると素早くcreate, read, update, deleteを実現することができ効果的です。
私の場合、このような方法で色んな言語やフレームワークを速く経験することができました!
- 投稿日:2021-01-09T01:53:52+09:00
Ruby,Rails ようやくインストール完了
やはりすんなりいかないRuby,Railsインストール
前回に引き続き、
RubyとRailsのインストールを進めるもやはりすんなりいかない。
しかし今回は約1年半前に挫折した経験があるのである程度は要領を得ている。まずはRuby
$ brew install railsでインストールすると、バージョンが2.5.0であった。
2.6.0あたりでインストールしたいので下記コマンドでアップグレード。
下記コマンドは約1年半前の記録を参照。こちら$ cd ~/.rbenv $ git pull origin master $ cd ~/.rbenv/plugins/ruby-build $ git pull origin master $ rbenv install 2.6.0 $ rbenv global 2.6.0 $ rbenv rehash $ ruby -v ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-darwin19]次はRails
$ gem install railsで処理完了後バージョン確認するといない。
$ rails -v Rails is not currently installed on this system. To get the latest version, simply type: $ sudo gem install rails You can then rerun your "rails" command. $ sudo gem install rails Password: Successfully installed rails-6.1.0 1 gem installed $ rails -v Rails is not currently installed on this system. To get the latest version, simply type: $ sudo gem install rails You can then rerun your "rails" command.すどぅーをやれと言われているようなので、すどぅー発動し、成功したかと思わせるが、
バージョン確認すると、またすどぅーをやれの繰り返し。ググる
こちらのブログを参考にさせていただき解消。
railsをインストールしたのに Rails is not currently installed on this system と出る場合の対処法$ export PATH="$HOME/.rbenv/shims:$PATH" $ rails -v Rails 6.1.0とりあえずOKでしょう。