- 投稿日:2021-01-07T23:49:41+09:00
[Rails] RSpec エラー expected `User.count` to have changed by 1, but was not given a block
はじめに
Rails のテストツール Rspec を使ってみました。
使用中に、expectedUser.count
to have changed by 1, but was not given a block と言うエラーにハマったので備忘録として残します。問題のソースコード
これがエラーの出るソースコードです。
エラーのでるソース
expect( find('input[name="commit"]').click ).to change{User.count}.by(1)エラーの内容
エラー expected
User.count
to have changed by 1, but was not given a block
翻訳User.count
が1変更されると予想されましたが、ブロックが与えられませんでしたchange マッチャを使うときは、expectをブロックにしなきゃいけないよって事でした。
つまり、()だと引数を渡してるので、{}にして動作そのものを渡せって事みたいです。
それを踏まえて、ソースを書き直します。正常に動作するソース
expect{ find('input[name="commit"]').click }.to change{User.count}.by(1)これで実行したら正常に動作しました。
ブロックは メゾット名 do / end って書き方もあるのでついでにこのようにソースを書き換えて実行しました。
実験1
expect do find('input[name="commit"]').click end.to change{User.count}.by(1)実験1結果 成功!!
27: # }.to change{User.count}.by(1) 28: #実験 29: # expect( 30: # find('input[name="commit"]').click 31: # ).to change{User.count}.by(1) => 32: binding.pry 33: expect do 34: find('input[name="commit"]').click 35: end.to change{User.count}.by(1) 36: 37: [1] pry(#<RSpec::ExampleGroups::Nested::Nested>)> exit 正しい情報を入力すればユーザー新規登録ができてトップページに移動する ユーザー新規登録ができないとき 誤った情報ではユーザー新規登録ができずに新規登録ページへ戻ってくる Finished in 17.61 seconds (files took 1.73 seconds to load) 2 examples, 0 failuresメゾット名 do / end でも正常に動くことを確認しました。
ついでに、もう一つ確認しました。chage のブロックを do / end に変更。
実験2
expect do find('input[name="commit"]').click end.to change do User.count end.by(1)実験2結果 失敗。。。
Failure/Error: expect do find('input[name="commit"]').click end.to change do User.count end.by(1) SyntaxError: Block not received by the `change` matcher. Perhaps you want to use `{ ... }` instead of do/end?構文エラーになりました。
エラーの内容
エラー Block not received by the
change
matcher. Perhaps you want to use{ ... }
instead of do/end?
翻訳change
マッチャーがブロックを受信していません。 おそらく、do / endの代わりに{...}
を使用したいですか?結果は、{} 使えって言われました。
わざわざ、do / end なんて使わず{}で統一するのが良さそうですね。まとめ
- ()だと引数になって、{}だとブロックをわたす。
- expect {}.to change{}.by() と書く。
- do / end は使わない。
最後まで読んでくださり、ありがとうございました。
- 投稿日:2021-01-07T23:48:25+09:00
RailsにおけるURLの直打ちを阻止する方法
きっかけ
viewファイルに条件分岐を作っていても、そもそもUrlから直打ちされてしまうとページに飛ばれてしまうことに気づいたため。
結論
任意のコントローラーにbefore_actionを使って、アクションを起こす前段階の条件分岐を作っておく。
コード
items.controller.rbclass ItemsController < ApplicationController #before_actionを使って、コントーラーのアクションに飛ぶ前に条件分岐をかける before_action :correct_user, only: [:edit] before_action :item_find, only: [:show, :edit, :update, :destroy] def edit end private def item_params params.require(:item).permit(:title, :explain, :category_id, :condition_id, :price, :delivery_fee_id, :prefecture_id, :delivery_date_id, :image).merge(user_id: current_user.id) end # before_actionをかけたメソッドでユーザーの選別を行っている def correct_user @item = Item.find(params[:id]) if user_signed_in? && @item.user == current_user render :edit else redirect_to root_path end end補足
Urlに直打ちしているということは、ルーティングを経由して必ずコントローラーにページの開示を求めにくるから、コントーラーに記述する必要がある。MVCの流れを今一度再確認できた。
- 投稿日:2021-01-07T22:54:30+09:00
kaminariにもう少しだけ詳しくなってみた。kaminati_themesの使用、configファイルの生成
何をしたか
何度も使っているgemではあるのですが、故になかなかしっかりreadmeも読んだことのないgem。kaminariを公式ドキュメントも読みながら、もう少し丁寧に実装してみました。
具体的には、
-config
ファイルの生成
-kaminari_themes
の利用をしました。kaminariの実装そのものには深く込み入っていません。
設定ファイル kaminari_config.rbの生成
kaminariの表示件数は、こんな感じでずっと描いていたのですが、
@posts = Post.page(params[:page]).per(15)諸々のコードを見ていくうちに、設定ファイルがありそうということに気づき、調べてみました。すると、公式のこちらの記載を見つけました。
rails g kaminari:config↑このコマンドで、
config/initializers/
配下にkaminari_config.rb
というファイルが生成されます。(同様のファイルならgenerateコマンドを使って生成しなくても良いみたいです。)設定ファイルにはデフォルトでこんな内容が書かれています。
config/initializers/kaminari_config.rbKaminari.configure do |config| # config.default_per_page = 25 # config.max_per_page = nil # config.window = 4 # config.outer_window = 0 # config.left = 0 # config.right = 0 # config.page_method_name = :page # config.param_name = :page # config.max_pages = nil # config.params_on_first_page = false endよく使うオプションが一通りそろっているみたいです。
この中のdefault_per_page
をconfig.default_per_page = 10にすれば、表示件数がデフォルトで調整できる様になりました。
見た目の変更について
見た目については、以下のコマンドで設定できる様でした。
$ rails g kaminari:views テーマ名この、「テーマ名」の部分には、gem kaminariとは別のページにライブラリがあって、そこから選択できる様です。
今回は
Bootstrap4
&slim
でテーマを適用したかったので、こちらのコマンドを実行しました。$ rails g kaminari:views bootstrap4 -e slim感想等
仕事場で見かけた
pagenate array
や、以前作成したけど没になったajaxによるページネーションもいつか調べて作ってみたいです。
- 投稿日:2021-01-07T22:54:30+09:00
kaminariにもう少しだけ詳しくなってみた。kaminari_themesの使用、configファイルの生成
何をしたか
何度も使っているgemではあるのですが、故になかなかしっかりreadmeも読んだことのないgem。kaminariを公式ドキュメントも読みながら、もう少し丁寧に実装してみました。
具体的には、
-config
ファイルの生成
-kaminari_themes
の利用をしました。kaminariの実装そのものには深く込み入っていません。
設定ファイル kaminari_config.rbの生成
kaminariの表示件数は、こんな感じでずっと描いていたのですが、
@posts = Post.page(params[:page]).per(15)諸々のコードを見ていくうちに、設定ファイルがありそうということに気づき、調べてみました。すると、公式のこちらの記載を見つけました。
rails g kaminari:config↑このコマンドで、
config/initializers/
配下にkaminari_config.rb
というファイルが生成されます。(同様のファイルならgenerateコマンドを使って生成しなくても良いみたいです。)設定ファイルにはデフォルトでこんな内容が書かれています。
config/initializers/kaminari_config.rbKaminari.configure do |config| # config.default_per_page = 25 # config.max_per_page = nil # config.window = 4 # config.outer_window = 0 # config.left = 0 # config.right = 0 # config.page_method_name = :page # config.param_name = :page # config.max_pages = nil # config.params_on_first_page = false endよく使うオプションが一通りそろっているみたいです。
この中のdefault_per_page
をconfig.default_per_page = 10にすれば、表示件数がデフォルトで調整できる様になりました。
見た目の変更について
見た目については、以下のコマンドで設定できる様でした。
$ rails g kaminari:views テーマ名この、「テーマ名」の部分には、gem kaminariとは別のページにライブラリがあって、そこから選択できる様です。
今回は
Bootstrap4
&slim
でテーマを適用したかったので、こちらのコマンドを実行しました。$ rails g kaminari:views bootstrap4 -e slim感想等
仕事場で見かけた
pagenate array
や、以前作成したけど没になったajaxによるページネーションもいつか調べて作ってみたいです。
- 投稿日:2021-01-07T22:49:56+09:00
ポートフォリオのREADMEを書くときの工夫
はじめに
ポートフォリオ用にアプリケーションを作成し、READMEを記述したので、そのときに気をつけたことを紹介します。
?アクセント程度に絵文字を使う
見出しの前に内容に合った絵文字を入れました。ただし、中には表示されない絵文字もあるので、その絵文字が思い通りに表示されているのか確認が必要です。
画像やgifを入れて、実装されている機能を見せる
簡単にスクショ&gifを取れるアプリ
Gyazoちなみに、マークダウン記法で画像を挿入するには、
![ここに文字](ここにURL)本当に改行できてる?
箇条書きのリストであれば、勝手に改行されるが、自分が任意のところで改行したいときは、
単に、Enterを押しても改行されません。これは、マークダウン記法の仕様です。
改行をするには、改行したいところに半角スペースを2つつけることです。
- 投稿日:2021-01-07T22:02:25+09:00
Ransackでor検索機能を作る。
使用環境
rails 6.0.2 ubuntu (WSL)手順
gemインストール
gem 'ransack'
bundle
を忘れずに。内容の検索
post_controller
は既に作ってあるものとします。posts_controller.rbdef index unless params[:q].blank? #入力された単語を空白で分割 split_keyword = params[:q][:content_cont].split(/\p{blank}/) end @q = Post.ransack(content_cont_any: split_keyword) @posts = @q.result end入力(検索ワード)があるか調べる。
ここがないとエラーになると思う。unless params[:q].blnak?検索フォーム
posts/index.html.slim= search_form_for @q, class: 'mb-5 search-container' do |f| .form-group.row = f.search_field :content_cont, placeholder: "キーワードを入力してください", class: "form-control" = f.submit class: "btn btn-outline-primary"
- 投稿日:2021-01-07T21:40:11+09:00
【Rails】FontAwesomeを導入する方法
はじめに
FontAwesomeをrailsで導入するってすごく簡単なのに、簡単すぎるせいか、やり方を記載しているものを見つけにくかったので、こちらに記載します。
私はgemをインストールしてみたり、yarn add〜してみたりして2時間ほど潰れました(笑)
※初学者による記載ですので、誤りがあればご指摘願います。導入方法
まずFontAwesomeのアカウントを作成します。
Font Awesomeログインして、下の写真にあるManage Kitをクリックします。
そうすると下の写真のページに行くので、黒く塗り潰してある部分(本来は英数文字が書かれています)をクリックします。
Copy Kit Code!でコードをコピーします。
ここまで完了したら、Railsに戻ります。
app/views/layout/application.html.erb
へ先ほどのコードを記載します。これでFontAwesomeが動くはずです!
FontAwesomeのコードを記載してみましょう!【参考】
Qiita: 【無料教材】Tailwind CSS & Rails6でQiitaを模写してみた【バックエンド演習に利用可】
Youtube: 【Ruby on Rails】Font Awesomeをrailsのボタンに導入する Adding Font Awesome to Ruby on Rails
- 投稿日:2021-01-07T18:48:10+09:00
rails error解消まとめ
▼問題点
railsにてコマンドrails console と打ったが下記errorがでる。Usage:
rails new APP_PATH [options]▼対処手順
①qiitaで調べる②gitやbundleの再インストールが必要?
⇨解決できず③カレントディレクトリがプロジェクトと紐づいてないのでは?
⇨解決▼所感
どうやら、ターミナルを新しく立ち上げた際にカレントディレクトリが変更されていたようだ。初歩的だが、同じ系統の過ちが多いので留意する。
- 投稿日:2021-01-07T14:51:53+09:00
HerokuでPGBackupsを使う
はじめに
Herokuでデータベースのバックアップを取るコマンド、PGBackupsを使ってみる。
使い方は公式サイトにそのままあるので、ご参考下さい。
https://devcenter.heroku.com/articles/heroku-postgres-backups環境
Rails 5.2.4.2
Vagrant + Ubuntu 16.04.5 LTSやってみた事
Herokuにログインします。
$heroku login --interactiveバックアップ対象のアプリ名を確認します。
$heroku appsアプリ名を指定して、手動でバックアップを取ります。
$heroku pg:backups:capture --app アプリ名ステータスを表示して、バックアップが取れている事を確認する。手動で取ったバックアップの場合、ダンプファイルにはbで始まるIDが付番され、スケジューラから作成されたバックアップには、aで始まるIDが付番されるようです。タイムスタンプは9時間の時差で表示されるので注意。
$heroku pg:backups --app アプリ名ここで、Webアプリを立ち上げて、適当にデータを更新してみます。この後、リストアしてデータが元に戻っている事を確認します。
バックアップファイルをリストア(復元)します。b002を指定していますが、バックアップを取ったIDになります。プロンプトが出てくるので、アプリ名を入力する事になります。
$heroku pg:backups:restore b002 --app アプリ名 > アプリ名を入力するWebからアプリを立ち上げて、先ほど、適当に更新したデータが元に戻っている事を確認します。
作成したバックアップダンプは削除しておきます。
$heroku pg:backups:delete b002 --app アプリ名 > アプリ名を入力する再び、ステータスを表示して、IDがb002のバックアップダンプが削除されている事を確認します。
$heroku pg:backups --app アプリ名Herokuからログアウトして終了。
$heroku logout
- 投稿日:2021-01-07T13:55:40+09:00
devise使わずユーザー編集・更新機能を実装する
はじめに
今回はユーザーのマイページを実装してから、プロフィールを編集できるようにするための方法を解説します。
前提条件
・deviseを導入済み
・deviseによるゆーざー新規登録/ログイン機能を実装済み開発環境
Ruby 2.6.5
Rails 6.0.0
MySQL 5.6.50手順
1)ユーザー詳細(マイページの実装)
まずdeviseのものとは別に
usersコントローラー
を作成します。
ターミナルにて以下コマンドを実行します。ターミナル$ rails g controller users showコントローラーが作成できたら、以下のようにファイルを編集ます。
controllers/users_controllerclass UsersController < ApplicationController before_action :set_user, only: [:show] def show; end private def set_user @user = User.find(params[:id]) end end次にルーティングも設定します
config/routes.rb# 既存の記述に追記する resources :users, only: [:show]これでマイページへのパスとアクションの設定は終わりました。
次にビューの記述をしていきます。
views/users/show.html.erb
にて記述していきます。
マイページの実装は以上です。2)ユーザー編集機能の実装
ここからは、あくまでも自分の場合なので、参考までにとどめてください。
まずDB設計(マイグレーションファイル)を以下のようにしました。
deviseのusesテーブルは
nickname
カラムのみ作成します。devise_create_users.rbclass DeviseCreateUsers < ActiveRecord::Migration[6.0] def change create_table :users do |t| ## Database authenticatable t.string :nickname, null: false t.string :email, null: false, default: '' t.string :encrypted_password, null: false, default: '' # 省略 end続いてプロフィール用のテーブルの設計をしていきます。
ターミナルにて以下のコマンドを実行します
(僕の場合はプロフィール用にintro
モデルを作成)ターミナル$ rails g model introマイグレーションファイルを編集します。
create_intros.rbclass CreateIntros < ActiveRecord::Migration[6.0] def change create_table :intros do |t| t.string :image t.string :first_name t.string :last_name t.string :website t.text :profile t.references :user, foreign_key: true t.timestamps end end end以上でテーブルの設計は終了です。
2-1)モデルのアソシエーションの設定
次にアソシエーションですが、以下のような設定にしました。
models/user.rbhas_one :intromodels/intro.rbbelongs_to :userこのように1対1の関係を結びました。
2-2)ルーティングとアクションの設定
config/routes.rbresources :users, only: [:show] resources :intros, only: [:new, :create, :edit, :update]ルーティングは上記のようにし、ネストはしませんでした。
理由は、ユーザー編集用のテーブルはイメージとしてはツイートなどの投稿用のテーブルと近いような気がしたからです。アクションもそうですが、イメージとしては投稿機能を、ユーザー編集に置き換えるとイメージを持つと実装しやすいかと思います。
次にアクションの定義を行います。
controllers/intros_controller.rbclass IntrosController < ApplicationController # 未ログインユーザーの処理 before_action :authenticate_user!, only: [:new, :edit] # リファクタリング before_action :set_intro, only: [:edit, :update] def new @intro = Intro.new # すでに登録済みのユーザーが新規登録ページに遷移しないようにする if Intro.find_by(user_id: current_user.id) redirect_to root_path end end def create @intro = Intro.new(intro_params) # 保存できたら、ユーザー詳細ページに戻るため引数にintroモデルに紐づくuserのidをわたす # intoro.valid?でないのはバリデーションをかけていないため if @intro.save redirect_to user_path(@intro.user.id) else render :new end end def edit # ログイン中のユーザーと編集するユーザーが一致しないとページに遷移できないようにする unless current_user.id == @intro.user.id redirect_to user_path(@intro.user.id) end end def update # createと同じように更新できたらユーザー詳細に戻るため引数をわたす if @intro.update(intro_params) redirect_to user_path(@intro.user.id) else render :edit end end private def set_intro @intro = Intro.find(params[:id]) end def intro_params params.require(:intro).permit(:first_name, :last_name, :website, :profile, :image).merge(user_id: current_user.id) end endこれでユーザー編集・更新機能の実装はほとんど完了です。
最後にビューを作成します。また、この時ユーザー編集ページへ遷移するリンクに条件を指定します。
2-3)views/users/show.html.erbの編集
users/show.html.erb<% if user_signed_in? %> # introテーブルにUserの値が存在しなれば新規登録のリンクを表示 <% unless @user.intro.present? %> # ログインしているユーザーとマイページに表示されているユーザーが同じなら新規登録のリンクを表示 <% if current_user.id == @user.id %> <div class="profile-btn"> <%= link_to 'プロフィールを編集する', new_intro_path, class: "profile-edit-btn" %> </div> <% end %> <% end %> # ログインしているユーザーとマイページに表示されているユーザーが同じで、かつintroテーブルに値が存在していれば編集ページへのリンクを表示する <% if current_user.id == @user.id && @user.intro.present? %> <div class="profile-btn"> <%= link_to 'プロフィールを編集する', edit_intro_path(@user.intro.id), class: "profile-edit-btn" %> </div> <% end %> <% end %>僕の場合はこのような記述しかできませんでしたが、もっと良い記述があればコメントくださると嬉しいです。
僕はここにたどり着くまでに1日半かかったので、この記事を見て少しでも作業が進んだという方がいらっしゃれば幸いです。
参考文献
- 投稿日:2021-01-07T13:42:58+09:00
【Ruby on Rails】「||=」←この代入演算子の使い方まとめ
代入演算子
代入演算子
とは、変数に対して何か値を代入する為の演算子です。
以下記事にわかりやすく解説してあるので、わからない方は読んでみてください。https://wa3.i-3-i.info/word18049.html
代入演算子
には以下のようなさまざまな種類が存在します。
記号 意味 = 代入 += 加算して代入 -= 減算して代入 *= 乗算して代入 /= 除算して代入 %= 乗余して代入 **= 累乗して代入 「||=」(or equal)の代入演算子
代入演算子の中に、
「||=」
このような代入演算子も存在します。「=」と「||」が合体した演算子です。
「=」
は代入を意味します。上でも記載したが代入演算子の一種です。a = b a に b を代入します。
続いて、
「||」
はどちらかの条件が成立すれば、trueを返すという演算子です。(ORを意味します。)
これは、論理演算子と呼ばれています。
if文と一緒に使うと以下のようになります。if a || b #a または b がtrueでtrueであればtrueを返す。 #a か b がtrueの場合 else #両方falseの場合 endこの2つの演算子が合体するとどのような挙動になるのか。
a ||= b a がfalseもしくは未定義ならbを代入します。 また a = (a || b) と同じ意味に当たります。
というような挙動になります。
実際の例文を以下に記載します。def current_user @current_user ||= User.find_by(id: session[:user_id]) end変数
@current_user
が存在する場合、もともと存在する@current_user
を返します。変数
@current_user
が存在しない場合、User.find_by(id: session[:user_id])
でユーザーを見つけ、そのまま@current_user
という変数に代入します。上記コードは、以下のように書き換えることも可能です。
def current_user @current_user = @current_user || User.find_by(id: session[:user_id]) end参考文献
Rails tutorial 第8章
https://railstutorial.jp/chapters/log_in_log_out?version=4.2#cha-log_in_log_out
- 投稿日:2021-01-07T13:38:10+09:00
deviseのlockableを使うときに意識しないといけないこと
つまり
config.unlock_strategy
を:time
や:none
にするときはよく考えてバージョン
- Rails 6.1.0
- devise 4.7.3
lockableについて
deviseのlockableは、ログインに何回か失敗したらアカウントロックを行う、というもの。
注意すべきは、「ログインがロックされる」のではなく、「アカウントがロックされる」のだということ。
これは、アカウントロック中にアクセスしたログイン中セッションは、全て強制ログアウトされる動作になる。これを利用して、次のようなイタズラをされると、結構困る。
- ユーザAがdeviseを使ったwebサービスにログインしている
- 他人がユーザAのメールアドレスでログインしようとするが連続で失敗して、ユーザAのアカウントロックされる
- ユーザAがアカウントロック中にwebサービスにアクセスする
- ログアウトされて、ユーザAはロック解除されるまでwebサービスが利用できなくなる
回避方法
同回避するか、3つほど考えた。
メールアドレスでアンロックできるようにする
deviseの設定に
unlock_strategy
という物があり、これには:time
,:both
,:none
が指定できる。
- アンロックするリンクをメールで送信する
:time
- 指定時間が経過するまでロックされる
:both
:time
で自然にアンロックされるか両方- デフォルトはこれなので、比較的安心か。
:none
- アンロック方法は無い。アンロックにはDB直接いじるしかなさそう?
このうち、
:both
の場合はロックされたアカウントの所有者が自分でロックを解除できるので、アカウントを使用できなくことに関する被害は少ない。
けど、:time
の場合は、イタズラでロックされたユーザがいた場合に、時間経過で解除されるのを待たないといけない(config.unlock_in
のデフォルトは1時間)ので、困ることも発生する。ログインだけロックする
「アカウントロック」ではなく、「ログインをロック」にする場合。
難易度が非常に高いからおすすめしないのだけれど、active_for_authentication?
をオーバーライドする方法がある。
めっちゃ単純なアプリでlockableのみを使っている場合は、次のようにしても良いかもしれない。def active_for_authentication? true endでも、confirmableとかも使っている場合は? 他にも色々なアカウントのアクティベーションに関する仕様がある場合は?
安易にactive_for_authentication?
をtrue
にしないようにしましょう、余計なセキュリティリスクが増えます。deviseを使わない
例えば、deviseを避ける
終わりに
セキュリティに関する話なので、間違っているとまずい・・。
厳しいご指摘お待ちしております。
- 投稿日:2021-01-07T12:51:46+09:00
「bundle exec rubocop -a」を使って失敗したお話
■状況
staffマイグレーションの簡単な修正を行う
コンフリクトが起きる
ローカルのmainブランチを最新にする
git merge メインブランチを行い、コンフリクトを解消する
「bundle exec rubocop」でいくつかエラーが出たため、「bundle exec rubocop -a」を実行
「bundle exec rubocop」を行うが、以下のエラーだけ解消されないコンソール# bundle exec rubocop app/models/user.rb:47:3: C: Rails/UniqueValidationWithoutIndex: Uniqueness validation should be with a unique index. validates :email, presence: true, length: { maximum: 70 }, ...しかし、このファイルは今回自分は触っていないため、原因が分からず。
結果、以下の方法で検証・解決しました。
・念のためメインブランチをテスト実行→エラー0件
・そのため、「bundle exec rubocop -a」が何かしているのではないかと予測
・確認した結果、rubocopの警告を無視する記述(コメント)が自動的に削除されている事が判明削除された記述を戻し、エラーは0件となりました!
rubocopの警告を無視する記述に関しては
以下が参考になるかと思います。(古いかも?)
- 投稿日:2021-01-07T09:07:46+09:00
vue.jsをrails6で動かすためにwebpack.config.jsを設定してたらエラー出過ぎて草
webpack CLIを動かせるようにしてみる
webpack.config.jsを設定しているのでその設定が正しいかの確認ができればと思いやってみた。
このようなファイル構成にしているのでfrontendディレクトリで以下のコマンドを実行してみた。
webpack --config webpack.config.jsすると以下のように表示される。
webpack --config webpack.config.js CLI for webpack must be installed. webpack-cli (https://github.com/webpack/webpack-cli) We will use "npm" to install the CLI via "npm install -D". Do you want to install 'webpack-cli' (yes/no): yesどうやらwebpackをCLIで動かすためのツールが必要そうである。インストールしますか?と聞かれているので素直にyesと回答
Error: Cannot find module 'webpack-cli/package.json'するとエラーが発生した。おいおいなんでや…
npm install -g webpack-cliということでやむなくグローバルインストールを試すことに。
/usr/local/bin/webpack-cli -> /usr/local/lib/node_modules/webpack-cli/bin/cli.js npm WARN webpack-cli@4.3.1 requires a peer of webpack@4.x.x || 5.x.x but none is installed. You must install peer dependencies yourself. + webpack-cli@4.3.1 added 46 packages from 31 contributors in 4.209sお、インストールできたっぽい。
これで
webpack --config webpack.config.jsこのコマンドでwebpack.config.jsを読み込むことができるようになった。やった!
次はwebpack.config.jsの設定に移ろう。
一段落したので遭遇したエラーと対処法をまとめた。
webpack --config webpack.config.jsこのコマンドを打つとwebpack.config.jsを読み込んでくれるのでそこで出たエラーを紹介。このエラーを解消しないとwebpacl.config.jsが動かないので…
configuration.module has an unknown property 'loaders'.
configuration.module has an unknown property 'loaders'. These properties are valid: object { defaultRules?, exprContextCritical?, exprContextRecursive?, exprContextRegExp?, exprContextRequest?, noParse?, rules?, strictExportPresence?, strictThisContextOnImports?, unknownContextCritical?, unknownContextRecursive?, unknownContextRegExp?, unknownContextRequest?, unsafeCache?, wrappedContextCritical?, wrappedContextRecursive?, wrappedContextRegExp? } -> Options affecting the normal modules (`NormalModuleFactory`).vue-loaderを読み込むために以下のように記述したところ上記エラーに遭遇
module: { loaders: [ ここ { loader: 'vue-loader'おい!なんでや!となったが代替案も出してくれてたのでそれに倣うことにした。
Did you mean module.rules or module.rules.*.use?module: { rules: [ { loader: 'vue-loader' } ] },loadersをrulesに修正して解決。
TypeError: this._init is not a function at Object.vue
TypeError: this._init is not a function at Object.Vuevueオブジェクトのコンストラクタが動いていなさそうな感じ。調べたら即解決した。
module: { rules: [ { loader: 'vue-loader' } ] },loaderの部分でvue-loaderを読み込む設定が必要だった。
[vue-loader] vue-template-compiler must be installed as a peer dependency,
なんか設定がたりなさそう。調べたところ指示された通りcompilerをインストールすれば良さそう
npm install vue-template-compiler --save-devこれで解決
vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.
なんか今度はpluginが足りませんと出る。
これも調べたらwebpack.config.js内でプラグインを導入すればいいことに気づき、以下のように記述
const { VueLoaderPlugin } = require("vue-loader"); module.exports = { (省略) plugins: [new VueLoaderPlugin()] }requireも記述しないと以下のエラーが出てしまう
ReferenceError: VueLoaderPlugin is not definedNo matching rule for .vue files found.
これも調べたところconfig内にvueを読み込む設定が必要とのことで以下のように記述
module: { rules: [ { test: /\.vue$/, #ここ exclude: /node_modules/, loader: 'vue-loader' } ] },testの部分で.vueを読み込むようにした。
The output directory as absolute path (required).
output: { path: `${__dirname}/../public/javascripts`, filename: '[name].js' },config内のoutput.pathが相対パスだと上記エラーになる。とはいえ絶対パスだと後々不便。と思って調べてたらdirnameというのを使うと良いとあったので使用。これは現在いるパスを変数化するものらしく絶対パスで参照してくれるようだ。
で、ここまでエラーを乗り越えるとようやくconfigが動くようになった。
webpack --config webpack.config.jsこれをすると
entryのファイルを使ってoutputに書かれたjsを出力してくれる。
今回はpuclicのjavascriptsディレクトリに出力した。
もう少し設定しないとrailsアプリで動かなさそうなので引き続き実装頑張ります…
【参考】
・webpack.config.jsで絶対パス指定を使わずに表記する方法
https://qiita.com/tmak_tsukamoto/items/8f8fc2be80542e3400d6
・VueLoaderPlugin Error] No matching rule for .vue files found - when files have different extension than .vueへの対処法
・【webpack】vue-loader was used without the corresponding plugin. Make sure to include VueLoaderPlugin in your webpack config.への対処法
https://qiita.com/7110/items/0721525ed6ccc263768b
・【webpack】[vue-loader] vue-template-compiler must be installed as a peer dependency, or a compatible compiler implementation must be passed via options.への対処法
https://qiita.com/7110/items/e6fba3dce01ea85bddb7
・Module build failed: TypeError: this._init is not a functionと出た
https://github.com/vuejs/vue-loader/issues/409
・loadersプロパティが使えない!と言われたときの対処法
- 投稿日:2021-01-07T08:25:49+09:00
railsでメール送信機能実装
はじめに
現場で使える Ruby on Rails 5速習実践ガイドでインプットを行っており、アウトプットで投稿しています。
サンプルは、タスク管理アプリです。今回の投稿では、ユーザーがタスクを登録したときに、「○○タスクが登録されました」というメールを送る機能を実装します。目次
メイラーの作成
メイラーとは、ActionMailerのことで、railsに搭載されているメールを送る機能です。controllerが、templateに情報を渡し画面出力を行っているのと同様に、Mailerもtemplateに情報を渡しメールを送信します。
まずは、今回実装するTaskMailerを作成します。以下のコマンドを実行します。rails g mailer TaskMailerメソッドを追加
先程のコマンドで
app/mailer/task_mailer.rb
というファイルが作成されます。そこに、今回送信するメールのメソッド「creation_email」を定義します。app/mailer/task_mailer.rbdef creation_email(task) @task = task mail( subject: 'タスク作成完了メール', to: 'user@example.com', from: 'task@example.com' ) endこちらのメソッドを呼び出すときに、追加されたタスクを引数として渡してもらいます。taskの内容をtemplateで表示するのでインスタンス変数に格納しています。
テンプレート作成
次にテンプレートを作成します。ユーザーの受信環境によっては、html形式のメールを表示できない可能性があります。text形式のファイルを合わせて作成し、html形式と合わせて送信しますのでファイルを二種類作成します。
app/views/task_mailer/creation_email.html.slim| 以下のタスクを作成しました ul li | 名称: = @task.name li | 詳しい説明 = simple_format(@task.description)app/views/task_mailer/creation_email.text.slim| 以下のタスクを作成しました = "\n" | 名称: = @task.name = "\n" | 詳しい説明 = "\n" = @task.description送信処理実装
ここまで来たらあとは、送信する処理を記述するのみです!
今回は、タスクの保存処理と合わせてメールを送信するため、tasks_controllerのcreateメソッドに送信処理を書きます。app/controllers/tasks_controller.rb略 if @task.save TaskMailer.creation_email(@task).deliver_now SampleJob.perform_later logger.debug "task:「#{@task.attributes.inspect}」を登録しました" redirect_to tasks_url, notice: "タスク「#{@task.name}」を登録しました。" else render :new end 略
deliver_now
は文字通り、即時に送信する命令です。5分後にメールを送りたいときは、deliver_later(wait: 5minutes)
とします。動作確認
メールが送信されたか、メールの内容は意図したとおりになっているか。これを確かめるために、「mailcatcher」というgemを使用します。
gem install mailcatcher上記のコマンドを実行し、railsの設定ファイルに以下の記述を行います。
config/environments/development.rb# Don't care if the mailer can't send. config.action_mailer.raise_delivery_errors = false # 以下二行を追記 config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { address: '127.0.0.1', port: 1025}上記は開発環境の設定ですが、本番環境の設定は、procuction.rbに記述をします。
設定ファイルの記述が完了したら、サーバーを再起動してください。
確認の手順は、
- ターミナルで
mailcatcher
を実行- メール送信のフローを実行後、
http://127.0.0.1:1080/
にアクセスそうすると、送信メールの確認ができます。
テスト作成
まずは、mailerのSpec用にディレクトリを作成します。
mkdir spec/mailers作成したフォルダの中に
task_mailer_spec.rb
を作成し、以下のように記述します。spec/mailers/task_mailer_spec.rbrequire 'rails_helper' describe TaskMailer, type: :mailer do endこれで枠組みは完成なので、実際にテストを書いていきます。
spec/mailers/task_mailer_spec.rbrequire "rails_helper" RSpec.describe TaskMailer, type: :mailer do let(:task){FactoryBot.create(:task, name: 'メイラーSpecを書く', description: '送信したメールの内容を確認します')} let(:text_body) do part = mail.body.parts.detect{|part| part.content_type == 'text/plain; charset=UTF-8'} part.body.raw_source end let(:html_body) do part = mail.body.parts.detect{|part| part.content_type == 'text/html; charset=UTF-8'} part.body.raw_source end describe '#creation_email' do let(:mail){TaskMailer.creation_email(task)} it "想定通りのメールが生成されている" do expect(mail.subject).to eq('タスク作成完了メール') expect(mail.to).to eq(['user@example.com']) expect(mail.from).to eq(['taskleaf@example.com']) expect(text_body).to match('以下のタスクを作成しました') expect(text_body).to match('メイラーSpecを書く') expect(text_body).to match('送信したメールの内容を確認します') expect(html_body).to match('以下のタスクを作成しました') expect(html_body).to match('メイラーSpecを書く') expect(html_body).to match('送信したメールの内容を確認します') end end end以下のコマンドを実行し通るか確認します。
bundle exec rspec spec/mailers/task_mailer_spec.rb参考文献
- 投稿日:2021-01-07T01:13:21+09:00
【初心者向け】Ruby on Rails チュートリアル第4版(Rails5.1)の環境構築を1時間以内で!
内容
言わずと知れたRuby on Railsチュートリアル、素晴らしい教材ですよね。全くの門外漢だった自分を駆け出しエンジニアのレベルまで引き上げてくれた神チュートリアルだと思っており、エンジニアとして就職した今も頻繁に見返す最高の教科書です。
Railsチュートリアルをはじめるにあたって最初に大きな壁として立ちはだかるのが環境構築です。私自身も約3ヶ月前に異業種からの転職でRubyエンジニアとして働きはじめたばかりなので、環境構築などの「プログラミング学習を始める以前の準備」に時間を取られた時のことは記憶に新しいです。
本記事では、一人でも多くのプログラミング初学者の方にRailsチュートリアルの魅力を感じて欲しいという思いから、無料で公開されているRailsチュートリアル第4版のための、すなわち「Ruby on Rails 5.1.6 開発環境を1時間以内に手に入れる」ための手順を紹介します。
※ Railsチュートリアルが推奨しているAWS Could9によるものではなく Virtual Box + Vagrant による環境構築となります
※ 本記事の姉妹記事はこちら
【環境構築】Ruby on Rails 6 開発環境を1時間以内に手に入れるゴール
Ruby on Rails 5.1.6 の開発環境を備えたUbuntuの仮想環境をmacOS上に構築する(目標1時間以内)。
前提環境
macOSCatalina バージョン 10.15.7
※ Windowsの方はゴメンナサイ。また、macOSの方でもバージョンの差異で多少の違いが発生する可能性はあります。
Virtual Box 6.1.16
※ インストール手順は後述
Vagrant 2.2.14
※ インストール手順は後述
想定する読者
・macOSユーザーの方
・macOSのターミナルを使った経験があり、基本的なLinuxコマンド(cd, mkdir, lsなど)の意味を知っている方
・ProgateなどでRuby on Railsの概要を学んだことがある方
・AWS Could9などのクラウドベースの統合開発環境に限界を感じている方
・過去にRuby on Railsの環境構築に挫折した経験のある方仮想環境とは?
使っているOS(ホストOS:本記事ではmacOSを想定)の中に、あたかも別のOS(ゲストOS:本記事ではUbuntuを使用)が入っているような環境のことを言います。
ホストOS上に開発環境を直接構築する場合、誤った設定や削除を行ってしまったことによりホストOSに悪影響を与えてしまう可能性はありますが、仮想環境上で環境構築をする場合であれば、何かミスをしてしまった時はその仮想環境ごと削除してやり直せば良く、ホストOSに悪影響を与えることはありません。
また、AWS Could9などのクラウドベースの統合開発環境よりもリソース拡張の自由度が高く、CPUの性能限界やメモリ不足に悩まされることは(少なくともRailsでWebアプリケーションを開発するだけであれば)ほとんどないと言っていいと思います。Virtual Box
仮想環境を構築するための「仮想化ソフト」として、まずはVirtualBoxをインストールします。
下記のダウンロードページから、(本記事ではmacOSを想定しているので)「OS X hosts」のリンクをクリックしてインストーラをダウンロードしてください。
ダウンロードしたインストーラを起動すれば、インストール手順がわかりやすく書いてあるので、それに従えばVirtual Boxのインストールは終了となります。
(※ 2021年1月7日現在の最新版は6.1.16なので、ここからはそのバージョンでの動作を前提としております)Vagrant
次に、仮想化ソフトを管理するツールであるVagrantをインストールします。
下記ダウンロードページにアクセスし、上記のVirtualBoxと同様に、インストーラのダウンロード、インストーラ起動、インストールという手順を踏めばほとんど迷うことなく完了すると思います。
仮想化ソフトである「VirtualBox」を操作するためのツールが「Vagrant」である、という認識を持っていただければとりあえず最低限の知識としてはOKです。
(※ 2021年1月7日現在の最新版は2.2.14なので、ここからはそのバージョンでの動作を前提としております)環境構築手順
Virtual BoxとVagrantを問題なくインストールしたら、ここからは実際に仮想環境を構築して行きたいと思います。今回は、Ubuntu(18.04)というゲストOSが入っている仮想環境を構築します。
ここからの操作はmacOSのターミナルで行います。作業に入る前にvagrantが正しくインストールされていることを確認しましょう。ターミナルを開いて
vagrant -v
と入力してみてください。Vagrant 2.2.14
という出力が返ってくれば準備はOKです、早速はじめていきましょう!1. vagrant-vbguestのインストール
$ vagrant plugin install vagrant-vbguest仮想マシンでの操作を簡単にしてくれる役割がある、という理解でとりあえずはOKです。
2. 任意の場所にディレクトリを作成
$ mkdir rails516_dev $ cd rails516_dev3. Vagrantfile作成
$ vagrant init上記コマンドでデフォルトの
Vagrantfile
が作成されます。Vagrantfile(デフォルト|一部抜粋)# -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| ~ ~ config.vm.box = "base" ~ ~ # config.vm.network "forwarded_port", guest: 80, host: 8080 ~ ~ # config.vm.network "private_network", ip: "192.168.33.10" ~ ~ end上記のデフォルト状態の
Vagrantfile
の中身を、下記のコードに書き換えてください。Vagrantfile(書き換え後)# -*- mode: ruby -*- # vi: set ft=ruby : # All Vagrant configuration is done below. The "2" in Vagrant.configure # configures the configuration version (we support older styles for # backwards compatibility). Please don't change it unless you know what # you're doing. Vagrant.configure("2") do |config| GUEST_RUBY_VERSION = '2.6.6' GUEST_RAILS_VERSION = '5.1.6' config.vm.box = "bento/ubuntu-18.04" config.vm.box_check_update = false config.vm.network "forwarded_port", guest: 3000, host: 3000 config.vm.network "private_network", ip: "192.168.33.10" config.vm.synced_folder "./", "/home/vagrant/work" config.ssh.forward_agent = true config.vm.provider "virtualbox" do |vb| vb.gui = false end config.vm.provision "shell", inline: <<-SHELL echo '### installing tools ###' sudo timedatectl set-timezone Asia/Tokyo sudo apt update -y sudo apt upgrade -y sudo apt install build-essential -y sudo apt install -y libssl-dev libreadline-dev zlib1g-dev sudo apt install -y imagemagick SHELL config.vm.provision "shell", privileged: false, inline: <<-SHELL echo '### installing Ruby ###' git clone https://github.com/sstephenson/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(rbenv init -)"' >> ~/.bash_profile source ~/.bash_profile git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build rbenv install #{GUEST_RUBY_VERSION} rbenv global #{GUEST_RUBY_VERSION} echo '### installing Rails ###' gem install rails -v #{GUEST_RAILS_VERSION} echo '### installing SQLITE3 ###' sudo apt install libsqlite3-dev sudo apt install sqlite3 echo '### installing NodeJS ###' sudo apt install -y nodejs npm sudo npm install n -g sudo n lts sudo apt purge -y nodejs npm sudo apt -y autoremove echo '### increasing inotify ###' sudo sh -c "echo fs.inotify.max_user_watches=524288 >> /etc/sysctl.conf" sudo sysctl -p echo ' -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-' echo 'You are now on Rails!' echo ' -+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-' SHELL end本記事での解説は避けますが、このVagrantfileにはRailsを使えるようにするための設定が書いてあります。最初は難解に感じるかもしれませんが、ぜひ一度、読み解くことをオススメします。
もちろん私が書いたこのVagrantfileが唯一の正解では決してないので、「もっといい書き方があるよ」「こっちの方が使いやすいと思う」っていうご意見も大歓迎です!
4. 仮想環境構築
$ vagrant up上記コマンドで仮想環境を構築します(PCのスペックにもよりますが、15〜30分ほどかかります)。
先ほどのVagrantfileに書かれた設定を1行ずつ実行していくことでRailsの開発環境が作られていっているということだけは抑えて頂けるといいかなと思います。5. 仮想環境へSSH接続
$ vagrant ssh上記コマンドで出来上がった仮想環境にSSH接続します。
SSH接続とは、ネットワークを経由して自身のPCから他のPC(今回は仮想環境)を安全に遠隔操作するための仕組みである、ということだけは抑えておいてください。ここまでがmacOSのターミナルでの操作です。次の「6. Railsアプリケーション作成」と「8. ssh接続の終了」ではmacOSからssh接続をして、ゲストOSのUbuntuを操作しているということをご認識ください。
6. Railsアプリケーション作成
vagrant@vagrant:~$ cd work vagrant@vagrant:~/work$ rails new sample_app vagrant@vagrant:~/work$ cd sample_app(補足) Railsアプリケーションの開発を進める方法
「2. 任意の場所にフォルダを作成」で作成したディレクトリ内に「6. Railsアプリケーション作成」で作成したRailsアプリと同名のファイルが作成されているはずなので、そこのコードを書き換えることで開発を進めます。
rails g controller Users
やbundle install
等のコマンドはSSH接続をした状態で、作成したRailsアプリケーションのディレクトリ上で叩くことになります。7. Gemfile編集
Gemfileを下記に書き換え(Railsチュートリアル第3章の内容)
Gemfilesource 'https://rubygems.org' gem 'rails', '5.1.6' gem 'puma', '3.9.1' gem 'sass-rails', '5.0.6' gem 'uglifier', '3.2.0' gem 'coffee-rails', '4.2.2' gem 'jquery-rails', '4.3.1' gem 'turbolinks', '5.0.1' gem 'jbuilder', '2.7.0' group :development, :test do gem 'sqlite3', '1.3.13' gem 'byebug', '9.0.6', platform: :mri end group :development do gem 'web-console', '3.5.1' gem 'listen', '3.1.5' gem 'spring', '2.0.2' gem 'spring-watcher-listen', '2.0.1' end group :test do gem 'rails-controller-testing', '1.0.2' gem 'minitest', '5.10.3' gem 'minitest-reporters', '1.1.14' gem 'guard', '2.16.2' gem 'guard-minitest', '2.4.4' end group :production do gem 'pg', '0.20.0' end # Windows環境ではtzinfo-dataというgemを含める必要があります gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]上記の書き換えが終わった後に
bundle update bundle install --without production rails s -b 0.0.0.0この状態で
http://localhost:3000/
にアクセスすると、Yay! You’re on Rails!
のデフォルト画面が表示されます。
立ち上げたRailsサーバーは
command + C
で停止することができます。8. ssh接続の終了
$ exit上記コマンドでSSH接続を終了することができます。
9. 仮想環境のマシンをシャットダウンする
vagrant halt上記コマンドで仮想環境上のゲストOSをシャットダウンすることができます。
再度立ち上げたい時は、vagrant up
で立ち上げvagrant ssh
で接続します(2回目以降は数分で完了します)。終わりに
いかがでしたでしょうか?スムーズに行けば、
Yay! You’re on Rails!
の表示まで1時間以内にいけるではないかなと思っております。Rubyという言語、Railsというフレームワークは触っていると本当に面白くて飽きないものなので、この記事で環境構築をしたことをきっかけに少しでもその魅力にハマっていただければ嬉しい限りです。
本記事についての質問や改善点のご指摘等がございましたら、コメントやTwitterでのDMなどをいただければ幸いです!
- 投稿日:2021-01-07T01:12:21+09:00
rails基本情報
環境構築
Railsのバージョンアップをする
Railsのバージョンアップ
$ gem install rails -v 5.2.4Railsのバージョンを確認
$ rails -vImageMagickをインストールする
ImageMagickは画像処理のためのソフトウェア。画像を扱うことがある場合はインストール。
username:~/environment $ sudo yum -y install libpng-devel libjpeg-devel libtiff-devel gcc username:~/environment $ cd username:~ $ wget http://www.imagemagick.org/download/ImageMagick.tar.gz username:~ $ tar -vxf ImageMagick.tar.gz username:~ $ ls username:~ $ cd ImageMagick-x.x.x-xx username:~/ImageMagick-x.x.x-xx $ ./configure username:~/ImageMagick-x.x.x-xx $ make username:~/ImageMagick-x.x.x-xx $ sudo make installImageMagickがインストールされているか確認.
$ convert -version
- 投稿日:2021-01-07T01:03:01+09:00
Rails再び。Homebrewで早速詰まる。
唐突に思い出す
役1年半前、ひたすらRailsを勉強していたことを思い出した。そしておもむろに書籍を買ってみた。ちなみに前回勉強していたときは、Railsチュートリアルでherokuでデプロイでつまずき脱落。
Homebrewインストールで早速詰まる
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"Homebrewのサイトからコピペでインストール
しかしこんな感じのエラー↓
Error: homebrew-core is a shallow clone. To brew update, first run: git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallow This restriction has been made on GitHub’s request because updating shallow clones is an extremely expensive operation due to the tree layout and traffic of Homebrew/homebrew-core and Homebrew/homebrew-cask. We don’t do this for you automatically to avoid repeatedly performing an expensive unshallow operation in CI systems (which should instead be fixed to not use shallow clones). Sorry for the inconvenience!よくみると、アップデートするためにまずこれをやれ
っぽいノリなのでやってみた↓git -C /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core fetch --unshallowほんでもう一回インストールやり直したら、
==> Installation successful!多分成功したのでしょう。寝ます。
- 投稿日:2021-01-07T00:44:00+09:00
「時間が経って、別の人が見ても使いやすいコードを書こう」( n回目 )
こんにちは、株式会社ベストティーチャーで元気に働く たわら です。
とある日
先輩 「 キャンペーンのダミーデータを作ってくれる? rakeタスクで 」
ボク 「 ハイ! 」ボク 「 ゴニョゴニョ、、、よし」
task campaign: :environment do Campaign.create( title: "ダミーキャンペーン", message: "条件 2021年1月1日(金)〜1月31日(日)までにキャンペーンに参加", duration: Time.zone.parse('2021-01-01 00:00:00')..Time.zone.parse('2021-01-31 23:59:59')) endボク「 できました! 」
先輩 「 ...... 」
先輩 「 ...... 」
先輩 「 これ一回きりしか使えないね、、、汎用性があるかたちに改善しよう! 」
先輩 「 時間が経って、別の人が見ても使いやすいコードを書こう 」
先輩 「 たとえば、先に変数で定義するとか。範囲は実行時点の月初から月末にするとか、、、 」
ボク 「 ハイ! 」task campaign: :environment do start_day = Time.current.beginning_of_month end_day = Time.current.end_of_month str_start_day = start_day.strftime("%Y/%m/%d/%a") str_end_day = end_day.strftime("%Y/%m/%d/%a") Campaign.create( title: "ダミーキャンペーン", message: " 条件 #{str_start_day}〜#{str_end_day}までにキャンペーンに参加 ", duration: start_day..end_day) end先輩 「 、、、んー、よいでしょう! 」
先輩 「 こうすれば、すぐ使えるね。毎回書き直さなくてよいから、今後使う人に親切になるね 」
ボク 「 勉強になりました! 」学び
時間が経って、自分以外の人がコードを見た場合の、可読性や利便性を考えて、コードを書きましょう!
エンジニアとしてガシガシ勉強してグングン成長したいです!宣伝
オンラインで英語を「書く」「話す」能力を磨く機会を提供するサービスを提供しています。
iOSエンジニアを募集していますので、よかったらご検討ください。英語を学びながら働きたいiOSエンジニア募集 - Qiita Jobs
https://jobs.qiita.com/employers/266/postings/1102