20210107のRailsに関する記事は19件です。

[Rails] RSpec エラー expected `User.count` to have changed by 1, but was not given a block

はじめに

Rails のテストツール Rspec を使ってみました。
使用中に、expected User.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 は使わない。

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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsにおけるURLの直打ちを阻止する方法

きっかけ

viewファイルに条件分岐を作っていても、そもそもUrlから直打ちされてしまうとページに飛ばれてしまうことに気づいたため。

結論

任意のコントローラーにbefore_actionを使って、アクションを起こす前段階の条件分岐を作っておく。

コード

items.controller.rb
class 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の流れを今一度再確認できた。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.rb
Kaminari.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

実際に、できたファイルがこちらです。
Image from Gyazo

感想等

仕事場で見かけたpagenate arrayや、以前作成したけど没になったajaxによるページネーションもいつか調べて作ってみたいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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.rb
Kaminari.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

実際に、できたファイルがこちらです。
Image from Gyazo

感想等

仕事場で見かけたpagenate arrayや、以前作成したけど没になったajaxによるページネーションもいつか調べて作ってみたいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ポートフォリオのREADMEを書くときの工夫

はじめに

 ポートフォリオ用にアプリケーションを作成し、READMEを記述したので、そのときに気をつけたことを紹介します。

?アクセント程度に絵文字を使う

見出しの前に内容に合った絵文字を入れました。ただし、中には表示されない絵文字もあるので、その絵文字が思い通りに表示されているのか確認が必要です。

画像やgifを入れて、実装されている機能を見せる

簡単にスクショ&gifを取れるアプリ
Gyazo

ちなみに、マークダウン記法で画像を挿入するには、

![ここに文字](ここにURL)

本当に改行できてる?

箇条書きのリストであれば、勝手に改行されるが、自分が任意のところで改行したいときは、
単に、Enterを押しても改行されません。これは、マークダウン記法の仕様です。
改行をするには、改行したいところに半角スペースを2つつけることです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ransackでor検索機能を作る。

使用環境

rails 6.0.2
ubuntu (WSL)

手順

gemインストール

gem 'ransack'

bundleを忘れずに。

内容の検索

post_controllerは既に作ってあるものとします。

posts_controller.rb
  def 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"

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】FontAwesomeを導入する方法

はじめに

FontAwesomeをrailsで導入するってすごく簡単なのに、簡単すぎるせいか、やり方を記載しているものを見つけにくかったので、こちらに記載します。
私はgemをインストールしてみたり、yarn add〜してみたりして2時間ほど潰れました(笑)
※初学者による記載ですので、誤りがあればご指摘願います。

導入方法

まずFontAwesomeのアカウントを作成します。
Font Awesome

ログインして、下の写真にあるManage Kitをクリックします。

スクリーンショット 2021-01-07 21.03.36.png

そうすると下の写真のページに行くので、黒く塗り潰してある部分(本来は英数文字が書かれています)をクリックします。
スクリーンショット 2021-01-07 21.04.01.png

Copy Kit Code!でコードをコピーします。

スクリーンショット 2021-01-07 21.04.28.png

ここまで完了したら、Railsに戻ります。
app/views/layout/application.html.erbへ先ほどのコードを記載します。

スクリーンショット 2021-01-07 21.28.37.png

これでFontAwesomeが動くはずです!
FontAwesomeのコードを記載してみましょう!

【参考】

Qiita: 【無料教材】Tailwind CSS & Rails6でQiitaを模写してみた【バックエンド演習に利用可】
Youtube: 【Ruby on Rails】Font Awesomeをrailsのボタンに導入する Adding Font Awesome to Ruby on Rails

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails error解消まとめ

▼問題点
railsにてコマンドrails console と打ったが下記errorがでる。

Usage:
rails new APP_PATH [options]

▼対処手順
①qiitaで調べる

②gitやbundleの再インストールが必要?
⇨解決できず

③カレントディレクトリがプロジェクトと紐づいてないのでは?
⇨解決

▼所感
どうやら、ターミナルを新しく立ち上げた際にカレントディレクトリが変更されていたようだ。

初歩的だが、同じ系統の過ちが多いので留意する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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_controller
class 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.rb
class 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.rb
class 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.rb
has_one :intro
models/intro.rb
belongs_to :user

このように1対1の関係を結びました。

2-2)ルーティングとアクションの設定

config/routes.rb
resources :users, only: [:show] 
resources :intros, only: [:new, :create, :edit, :update]

ルーティングは上記のようにし、ネストはしませんでした。
理由は、ユーザー編集用のテーブルはイメージとしてはツイートなどの投稿用のテーブルと近いような気がしたからです。

アクションもそうですが、イメージとしては投稿機能を、ユーザー編集に置き換えるとイメージを持つと実装しやすいかと思います。

次にアクションの定義を行います。

controllers/intros_controller.rb
class 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日半かかったので、この記事を見て少しでも作業が進んだという方がいらっしゃれば幸いです。

参考文献

【Rails】データが1件でもあるかどうかチェックするにはModel.exists?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

deviseのlockableを使うときに意識しないといけないこと

つまり

config.unlock_strategy:time:noneにするときはよく考えて

バージョン

  • Rails 6.1.0
  • devise 4.7.3

lockableについて

deviseのlockableは、ログインに何回か失敗したらアカウントロックを行う、というもの。
注意すべきは、「ログインがロックされる」のではなく、「アカウントがロックされる」のだということ。
これは、アカウントロック中にアクセスしたログイン中セッションは、全て強制ログアウトされる動作になる。

これを利用して、次のようなイタズラをされると、結構困る。

  1. ユーザAがdeviseを使ったwebサービスにログインしている
  2. 他人がユーザAのメールアドレスでログインしようとするが連続で失敗して、ユーザAのアカウントロックされる
  3. ユーザAがアカウントロック中にwebサービスにアクセスする
  4. ログアウトされて、ユーザAはロック解除されるまでwebサービスが利用できなくなる

回避方法

同回避するか、3つほど考えた。

メールアドレスでアンロックできるようにする

deviseの設定にunlock_strategyという物があり、これには:email:time, :both, :noneが指定できる。

  • :email
    • アンロックするリンクをメールで送信する
  • :time
    • 指定時間が経過するまでロックされる
  • :both
    • :emailでアンロックするか、:timeで自然にアンロックされるか両方
    • デフォルトはこれなので、比較的安心か。
  • :none
    • アンロック方法は無い。アンロックにはDB直接いじるしかなさそう?

このうち、:email:bothの場合はロックされたアカウントの所有者が自分でロックを解除できるので、アカウントを使用できなくことに関する被害は少ない。
けど、:timeの場合は、イタズラでロックされたユーザがいた場合に、時間経過で解除されるのを待たないといけない(config.unlock_inのデフォルトは1時間)ので、困ることも発生する。

ログインだけロックする

「アカウントロック」ではなく、「ログインをロック」にする場合。
難易度が非常に高いからおすすめしないのだけれど、active_for_authentication?をオーバーライドする方法がある。
めっちゃ単純なアプリでlockableのみを使っている場合は、次のようにしても良いかもしれない。

  def active_for_authentication?
    true
  end

でも、confirmableとかも使っている場合は? 他にも色々なアカウントのアクティベーションに関する仕様がある場合は?
安易にactive_for_authentication?trueにしないようにしましょう、余計なセキュリティリスクが増えます。

deviseを使わない

例えば、deviseを避ける

終わりに

セキュリティに関する話なので、間違っているとまずい・・。
厳しいご指摘お待ちしております。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「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の警告を無視する記述に関しては
以下が参考になるかと思います。(古いかも?)

https://qiita.com/tbpgr/items/a9000c5c6fa92a46c206

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

vue.jsをrails6で動かすためにwebpack.config.jsを設定してたらエラー出過ぎて草

webpack CLIを動かせるようにしてみる

webpack.config.jsを設定しているのでその設定が正しいかの確認ができればと思いやってみた。

webpack_config_js_—_chat-vue-app.png

このようなファイル構成にしているので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.Vue 

vueオブジェクトのコンストラクタが動いていなさそうな感じ。調べたら即解決した。

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 defined

No 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ディレクトリに出力した。

application_js_—_chat-vue-app.png

もう少し設定しないと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プロパティが使えない!と言われたときの対処法

https://qiita.com/kogache/items/1f0740e332f4674eb5b3

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsでメール送信機能実装

はじめに

現場で使える Ruby on Rails 5速習実践ガイドでインプットを行っており、アウトプットで投稿しています。
サンプルは、タスク管理アプリです。今回の投稿では、ユーザーがタスクを登録したときに、「○○タスクが登録されました」というメールを送る機能を実装します。

目次

  1. メイラーの作成
  2. メソッドを追加
  3. テンプレート作成
  4. 送信処理実装
  5. 動作確認
  6. テスト作成
  7. 参考文献

メイラーの作成

メイラーとは、ActionMailerのことで、railsに搭載されているメールを送る機能です。controllerが、templateに情報を渡し画面出力を行っているのと同様に、Mailerもtemplateに情報を渡しメールを送信します。
まずは、今回実装するTaskMailerを作成します。以下のコマンドを実行します。

rails g mailer TaskMailer

メソッドを追加

先程のコマンドでapp/mailer/task_mailer.rbというファイルが作成されます。そこに、今回送信するメールのメソッド「creation_email」を定義します。

app/mailer/task_mailer.rb
def 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.rb
require 'rails_helper'
describe TaskMailer, type: :mailer do
end

これで枠組みは完成なので、実際にテストを書いていきます。

spec/mailers/task_mailer_spec.rb
require "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

参考文献

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者向け】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なので、ここからはそのバージョンでの動作を前提としております)

Virtual Box ダウンロードページ

Vagrant

次に、仮想化ソフトを管理するツールであるVagrantをインストールします。
下記ダウンロードページにアクセスし、上記のVirtualBoxと同様に、インストーラのダウンロード、インストーラ起動、インストールという手順を踏めばほとんど迷うことなく完了すると思います。

仮想化ソフトである「VirtualBox」を操作するためのツールが「Vagrant」である、という認識を持っていただければとりあえず最低限の知識としてはOKです。

(※ 2021年1月7日現在の最新版は2.2.14なので、ここからはそのバージョンでの動作を前提としております)

Vagrant ダウンロードページ

環境構築手順

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_dev

3. 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 Usersbundle install 等のコマンドはSSH接続をした状態で、作成したRailsアプリケーションのディレクトリ上で叩くことになります。

7. Gemfile編集

Gemfileを下記に書き換え(Railsチュートリアル第3章の内容)

Gemfile
source '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

立ち上げた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などをいただければ幸いです!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails基本情報

環境構築

Railsのバージョンアップをする

Railsのバージョンアップ

$ gem install rails -v 5.2.4

Railsのバージョンを確認

$ rails -v

ImageMagickをインストールする

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 install

ImageMagickがインストールされているか確認.

$ convert -version
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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!

多分成功したのでしょう。寝ます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「時間が経って、別の人が見ても使いやすいコードを書こう」( 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

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む