20210127のRubyに関する記事は23件です。

ルーティングのネストについて

目次

①ネストをする意味
②ネストの記述方法
③ネストしない場合とする場合
④まとめ

①ネストをする意味

アソシエーション先のid情報を取得するためにネストをする。

②ネストの記述方法

以下のように親のコントローラに対してdoとendで挟んで記述をすると、ネストがされている状態になる。

Rails.application.routes.draw do
  resources :親となるコントローラー do
    resources :子となるコントローラー          
  end
end

③ネストしない場合とする場合

ネストなし
Rails.application.routes.draw do
  resources :images
  resources :comments, only: :create
end

ターミナル
Prefix   Verb    URI Pattern           Controller#Action
comments POST   /comments(.:format)   comments#create

ネストなしの場合、ターミナルにてrails routesをすると上記のように表示される。ではネストがある場合どうなるのだろうか?

ネストあり
Rails.application.routes.draw do
  resources :images do
    resources :comments, only: :create
  end
end
ターミナル
Prefix         Verb    URI Pattern                            Controller#Action
image_comments POST   /images/:tweet_id/comments(.:format)   comments#create

ネストありの場合、ターミナルにてrails routesをすると上記のように表示される。ネストした場合は、コメントの投稿先のidがあるのに対して、ネストしない場合は、どの画像に対してコメントかわからなくなってしまう。

まとめ

ネストをすることで親のidの情報を取得することができる。

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

【環境構築】Docker rails 備忘録

Docker使ってrailsでアプリを作成した際の備忘録

手順1

ファイル作成
既にDockerをインストールしているので
使用しているディレクトリの配下に任意の名前でディレクトリを作成し
以下作成したディレクトリにファイル準備。
・Gemfile
・Gemfile.lock
・Dockerfile
・docker-compose.yml
※ターミナルでのファイル作成コマンド:touch XXXXXX(※XXXに作成するファイル名)

手順2

作成したファイルの内容を編集

Gemfile
source 'https://rubygems.org'
gem 'rails', 5.2.2
Dockerfile
FROM ruby:2.5
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /sample
WORKDIR /sample

COPY Gemfile /sample/Gemfile
COPY Gemfile.lock /sample/Gemfile.lock

RUN bundle install
COPY . /sample
docker-compose.yml
version: '3'

services:
    db:
        image: mysql:5.7
        environment:
            MYSQL_USER: root
            MYSQL_ROOT_PASSWORD: password
        ports:
            - "3306:3306"
        volumes:
            - ./db/mysql/volumes:/var/lib/mysql

    web:
        build: .
        command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
        volumes:
            - .:/sample
            - gem_data:/usr/local/bundle
        ports:
            - 3000:3000
        depends_on:
            - db 
        tty: true
        stdin_open: true

volumes:
  gem_data:

手順3

Dockerコマンドを実行し、railsアプリケーションを作成
※Dockerを起動していない場合は次のコマンドを実行:
docker run -d -p 80:80 docker/getting-started

・rails new コマンド(DBにmysqlを指定)
docker-compose run web rails new . --force --database=mysql --skip-bundle

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

【Ruby】文字列の中に式や変数を埋め込みたい

文字列の中に式を埋め込みたい時

変数の値などを含む文字列を表示したい時、
Rubyでは文字列中に#{}で囲んだ式を埋め込むとスクリプト実行時にその式の評価した結果に置き換えられます。

sample = "sample_str"

message = "#{sample}さん、おはよう!" # => "sample_strさん、、おはよう!"

また数値(int)を代入した場合は計算結果に置き換えられます。

int1 = 5
int2 = 2

message = "5+2 = #{int1 + int2} です!" # => "5+2 = 7 です!"

まとめ

Rubyの「式展開」についてまとめました。
簡単ですけどよく使います。

Ruby 2.7.0 リファレンスマニュアル
https://docs.ruby-lang.org/ja/2.7.0/doc/spec=2fliteral.html#exp

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

Railsで検索機能実装方法

目次

①結論
②ActiveRecordとは
③whereメソッドとは
④whereメソッドの使い方

①結論

ルーティングを設定し、検索窓のビューを実装し、コントローラーにてActiveRecordのwhereメソッドを使用する

ルーティング
resources :users do
  get :search, on: :collection
end
コントローラ
def  search
 if params[:name] != ""
  @users =  User.where("name LIKE(?)","%#{params[:name]}%") 
else
  @users = User.all
end
検索機能のビュー
<h1>検索機能の実装</h1>
<%= form_with(url: search_users_path, method: :get, local: true)do |form| %>
  <%= form.text_field :name %>
  <%= form.submit :search %>
<% end %>


  <div calss= "contents">
    <% @users.each do |user| %>
       <p><%= user.name %></p>
    <% end %>
  </div>

②ActiveRecordとは

Rubyのライブラリのひとつで、Rubyのオブジェクト(Object)をSQLに翻訳してリレーショナルデータベース(RDBMS)を操作できる(Mapping)ツールのこと。Railsとデータベース橋渡しの役割をしている。この機能をそれぞれの頭文字をとって、ORMapperと呼ぶ。Railsには、ActiveRecordがデフォルトで組み込まれている。

③whereメソッドとは

テーブル内の条件に一致したレコードを配列の形で取得できるメソッドのこと

④whereメソッドの使い方

以下3つのパターンを紹介する
◯完全一致の場合

User.where(id:5)
#idの5が欲しいとき

User.where(name:"キャリア君")
#キャリア君を探したいとき

◯範囲検索(5~10のidのユーザーを取得したいとき)

User.where(id: 5..10)

◯部分一致(文字列)

User.where("name LIKE(?)","%キャリア%")

LIKE句は曖昧な文字列の検索をする時に使用するものでwhereメソッドと一緒に使用する。
name LIKEと書くことでnameカラムを検索、という意味になる。?は次の引数"%hana%"を受け取る場所になる。
?のことろに%◯◯%がそのまま入るイメージ。この場合だと、name LIKE "%キャリア君%"という風になる。%は任意の文字列を指します。まとめると、nameカラムにhanaを含むレコードを抽出する、という処理になる。

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

Railsでの検索機能実装方法(whereメソッド)

目次

①結論
②ActiveRecordとは
③whereメソッドとは
④whereメソッドの使い方

①結論

ルーティングを設定し、検索窓のビューを実装し、コントローラーにてActiveRecordのwhereメソッドを使用する

ルーティング
resources :users do
  get :search, on: :collection
end
コントローラ
def  search
 if params[:name] != ""
  @users =  User.where("name LIKE(?)","%#{params[:name]}%") 
else
  @users = User.all
end
検索機能のビュー
<h1>検索機能の実装</h1>
<%= form_with(url: search_users_path, method: :get, local: true)do |form| %>
  <%= form.text_field :name %>
  <%= form.submit :search %>
<% end %>


  <div calss= "contents">
    <% @users.each do |user| %>
       <p><%= user.name %></p>
    <% end %>
  </div>

②ActiveRecordとは

Rubyのライブラリのひとつで、Rubyのオブジェクト(Object)をSQLに翻訳してリレーショナルデータベース(RDBMS)を操作できる(Mapping)ツールのこと。Railsとデータベース橋渡しの役割をしている。この機能をそれぞれの頭文字をとって、ORMapperと呼ぶ。Railsには、ActiveRecordがデフォルトで組み込まれている。

③whereメソッドとは

テーブル内の条件に一致したレコードを配列の形で取得できるメソッドのこと

④whereメソッドの使い方

以下3つのパターンを紹介する
◯完全一致の場合

User.where(id:5)
#idの5が欲しいとき

User.where(name:"キャリア君")
#キャリア君を探したいとき

◯範囲検索(5~10のidのユーザーを取得したいとき)

User.where(id: 5..10)

◯部分一致(文字列)

User.where("name LIKE(?)","%キャリア%")

LIKE句は曖昧な文字列の検索をする時に使用するものでwhereメソッドと一緒に使用する。
name LIKEと書くことでnameカラムを検索、という意味になる。?は次の引数"%hana%"を受け取る場所になる。
?のことろに%◯◯%がそのまま入るイメージ。この場合だと、name LIKE "%キャリア君%"という風になる。%は任意の文字列を指します。まとめると、nameカラムにhanaを含むレコードを抽出する、という処理になる。

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

ActiveModel::Serializer のインストール方法

ActiveModel::Serializer ( Gem ) のインストールの仕方を簡単に書いておきます!

ActiveModel::Serializer ( Gem ) のインストール その①

Gemfile に以下のコードを記述する。

Gemfile
gem 'active_model_serializers'

その後、ターミナル上で bundle install を実行。

terminal
bundle install

ActiveModel::Serializer ( Gem ) のインストール その②

ターミナル上で以下のコマンドを実行し、
Gemfile に gem 'active_model_serializers' を追記。

terminal
echo "gem 'devise_token_auth'" >> Gemfile

その後、ターミナル上で bundle install。

terminal
bundle install

まとめ

どちらの方法でもインストール可能です。

本日、Qiita に初投稿してみました!とても簡単な内容かもしれませんが、自分が検索したときにパッと出てこなかったのと、Markdown の書き方の勉強を兼ねて投稿してみました!

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

ActiveModel::Serializer ( Gem ) のインストール方法

ActiveModel::Serializer ( Gem ) のインストールの仕方を簡単に書いておきます!

ActiveModel::Serializer ( Gem ) のインストール その①

Gemfile に以下のコードを記述する。

Gemfile
gem 'active_model_serializers'

その後、ターミナル上で bundle install を実行。

terminal
bundle install

ActiveModel::Serializer ( Gem ) のインストール その②

ターミナル上で以下のコマンドを実行し、
Gemfile に gem 'active_model_serializers' を追記。

terminal
echo "gem 'devise_token_auth'" >> Gemfile

その後、ターミナル上で bundle install。

terminal
bundle install

まとめ

どちらの方法でもインストール可能です。

本日、Qiita に初投稿してみました!とても簡単な内容かもしれませんが、自分が検索したときにパッと出てこなかったのと、Markdown の書き方の勉強を兼ねて投稿してみました!

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

オブジェクト思考におけるクラスの概念(Ruby)

クラスとインスタンス

 クラスは、インスタンスを作成する時に「元となる設計図」のことで、インスタンスは、設計図をもとに作成される実物体のことをいいます。

用語 役割 例1 例2
クラス 設計図 車の設計図 たい焼きの型
インスタンス 設計図をもとに作成される実物体 黒い車、赤い車 クリームのたい焼き、あんこのたい焼き

 Rubyは、「もの」を組み立てるように表現してコンピュータに指示するオブジェクト指向プログラミング言語です。「もの」を組み立てる際の設計図が「クラス」で、その設計図から作成された実物体のことを「インスタンス」と呼びます。

オブジェクト指向プログラミング言語

 プログラミングとは、コンピュータが理解できる言葉を並べてプログラムを作ることです。その際に、プログラムの意図したことを順番通りにコンピュータに動作させる指示を出しています。
 プログラムの意図したことを順番通りに表現する代表的な方法は以下の通りです。

プログラムの表現方法 プログラムの流れ
オブジェクト指向プログラミング 「もの」を組み立てる様に表現してコンピュータに指示する
手続き型プログラミング プログラムを上から順番に処理を実行する
関数型プログラミング 関数の組み合わせによってプログラムを組み立てる様に表現する

 このプログラムの表現方法の中で、Rubyは、オブジェクト指向プログラミング言語です。
 物を組み立てコンピュータを動作させるために、物の設計図であるクラスと物の実物体であるオブジェクトが必要です。

ポイント

①Rubyはオブジェクト指向プログラミング言語です。
②オブジェクト指向とは、「もの」を組み立てるように表現してコンピュータに指示するプログラムの表現方法
③物を組み立てプログラムを表現するために、物の設計図であるクラスと設計図から作成される実物体のインスタンスが必要です。

メソッドの特徴を理解しよう

 メソッドとは、複数の処理を1つにまとめて、扱いやすくしたものです。
 メソッドの基本的な書き方は、以下の通りになリます。

def メソッド名
  # 処理
end

# メソッド実行
メソッド名

 例)helloメソッドを定義して実行する

def hello
  puts "hello!"
end

# helloメソッド実行
hello
# => hello!

メソッドの特徴

 メソッドは下記のような特徴があります。
①メソッドに値を渡すことができる
②メソッド内で最後に評価される値を返す

def hello(name)
  puts "#{name},hello!"  ここがメソッド内で最後に評価されている
end

# helloメソッド実行
hello("kaito")
# => kaito,hello!

③メソッド内で定義した変数は、外部からアクセスすることができない

# メソッド内に変数を追加
def hello
  other_name = kaito
  puts "hello!"
end

# メソッド内の変数のather_nameをメソッド外から指定するとエラーが出る
puts other_name
# => NameError: undefind localvariable or method 'other_name' for main:object

クラスの作り方

 「たい焼きのイメージ」と「メソッドの特徴」を踏まえた上でクラスを作成します。

クラス作成

 クラスの定義は、以下のように記述します。

class クラス名
  # メソッドなど
end

 ここで重要なのは、メソッドの時と違いクラス名の最初の文字が大文字ということです。

class Taiyaki

  def メソッド
  end

end

インスタンス作成

 インスタンスは、以下のようにクラスから作成します。

クラス名.new

 たい焼きの型からたい焼きを作り出すには、以下のように記述します。

class Taiyaki

  def メソッド
  end

end

# たい焼きの設計図からたい焼きを作成
taiyaki = Taiyaki.new
# => <Taiyaki:0x00~>

 Taiyaki.newの返り値が、「Taiyaki:0x00~」なので、たい焼きのインスタンス(オブジェクト)が作成されたことがわかります。

initializeメソッドとインスタンス変数

 たい焼きを作ることができましたが、このままではたい焼きの味(taste)や値段(price)がわかりません。たい焼きに情報を持たせるためにインスタンス作成時に、たい焼きの情報を引数に渡します。

渡したいたい焼きの情報 インスタンス作成
あんこ味のたい焼き 250円 Taiyaki.new("あんこ", 250)
カスタード味のたい焼き 300円 Taiyaki.new("カスタード", 300)
抹茶味のたい焼き 330円 Taiyaki.new("抹茶", 330)

 引数で渡された値は、「インスタンス作成時」に実行されるinitializeメソッドを利用して「@のついたインスタンス変数」に代入します。

class Taiyaki

  # インスタンス作成の時に実行される
  def initialize(taste, price)
    # インスタンス変数には@をつける
    @taste = taste
    @price = price
  end

end

# newした際にinitializeメソッドが実行され、引数の値がインスタンス変数に代入される
anko_taiyaki = Taiyaki.new("あんこ", 250)
# => <Taiyaki:0x00~ @taste = "あんこ", @price = 250>

 インスタンスを作成するときに、initializeメソッド内でインスタンス変数に引数で渡した値を代入させることによって、インスタンス変数は、インスタンスごとに値を保持することができます。
 たい焼きを作りときは、それぞれのたい焼きごとに味や値段を変えることができます。

インスタンス作成 インスタンス変数の値の中身
Taiyaki.new("あんこ", 250) @taste="あんこ", @price=250
Taiyaki.new("カスタード", 300) @taste="カスタード", @price=300
Taiyaki.new("抹茶", 330) @taste="抹茶", @price=330

 メソッドの特徴として、メソッドの内で定義した変数はメソッドの外では利用できませんでしたが、インスタンス変数はインスタンス内であればどこでも呼び出すことができます。

インスタンスメソッド

 インスタンスメソッドとは、作成したインスタンスから実行できるメソッドのことです。
 先ほと作成したanko_taiyakiのインスタンスは、initizlizeメソッドでインスタンス変数に「@taste="あんこ", @price=250」を代入したため、この情報を保持してます。

 インスタンスメソッドは、このインスタンスごとに保持している情報を使って処理を書くことができます。

# たい焼きの設計図を作成
class Taiyaki

  # インスタンス作成時に実行される
  def initialize(taste, price)
    @taste = taste
    @price = price
  end

  # 作成したインスタンスから実行できるインスタンスメソッド
  # インスタンスによって、@taste,@priceの値が異なる
  def show_info
    puts "#{@taste}味のたい焼きは#{@price}円です。"
  end

end

# anko_taiyakiのインスタンス作成
anko_taiyaki = Taiyaki.new("あんこ", 250)
# => <Taiyaki:0x00~ @taste="あんこ", @price=250>

# 作成したanko_taiyakiのインスタンスからshow_infoインスタンスメソッドを実行する
anko_taiyaki.show_info
# => あんこ味のたい焼きは250円です。

 show_infoインスタンスメソッドは、作成したインスタンスによって文章の内容が異なります。これはインスタンスごとに保持するデータを変えることができるからです。
 試しにカスタード味のたい焼きを作って確認します。

custard_taiyaki = Taiyaki.new("カスタード", 300)
# <Taiyaki:0x00~ @taste="カスタード", @price=300>

custard_taiyaki.show_info
# カスタード味のたい焼きは300円です。

クラスメソッドの定義

 先程のインスタンスメソッドは、インスタンスから呼び出すことができましたが、その他にもクラスから呼び出すことができるクラスメソッドがあります。
 クラスメソッドとは、インスタンスに依存せずにクラス全体に紐付けられるメソッドのことです。インスタンスの持つデータを使う必要のない処理は、クラスメソッドで定義します。
 クラスメソッドは、2つの定義方法があります。

# クラスメソッドの定義方法1
class クラス名
  def self.クラスメソッド名
  end
end

# クラスメソッドの定義方法2
class クラス名
  # この中で定義するとクラスメソッドと認識されます。
  class << self
    # メソッド名にselfは必要ない
    def test
    end
  end
end

 クラスメソッドは、以下のように呼び出すことができます。

クラス名.クラスメソッド名

クラス変数

 インスタンス変数の他に、クラス変数という@が2つ付く変数があります。
 インスタンス変数が作成された各インスタンスごとに共有される変数だったのに対して、クラス変数は、全てのインスタンスで共有される変数です。
 たい焼きが全部で何個作成されたかわかるクラス変数「@@total_taiyaki_count」と、それを案内するクラスメソッドを定義します。

# たい焼きの設計図を作成
class Taiyaki

  # 全てのインスタンスで共有されるクラス変数
  @@total_taiyaki_count = 0

  # インスタンス作成時に実行される
  def initialize(taste, price)
    @taste = taste
    @price = price

    # インスタンスが作成(new)される毎にカウントアップ
    @total_taiyaki_count += 1
  end

  # インスタンスメソッド
  def show_info
    puts "#{taste}味のたい焼きは#{price}円です。"
  end

  # クラスメソッド
  def self.shoe_all_count
    puts "たい焼きは全部で#{@@total_taiyaki_count}個作成されました。"
  end

end

 クラス変数「@@total_taiyaki_count」によってTaiyakiクラスからインスタンスを作成する度に1ずつ増える為、たい焼きの作成した個数を知ることができます。

# anko_taiyakiのインスタンスを作成(カウントアップされる)
anko_taiyaki = Taiyaki.new("あんこ", 250)
# => <Taiyaki:0x00~ @taste="あんこ", @price=250>

# custard_taiyakiのインスタンスを作成(カウントアップされる)
custard_taiyaki = Taiyaki.new("カスタード", 300)
# => <Taiyaki:0x00~ @taste="カスタード", @price=300>

# たい焼きの個数を調べるためにshow_all_countクラスメソッドを実行する
Taiyaki.show_all_count
# => たい焼きは全部で2個作成されました。

終わりに

 今回は、クラスについて学習しました。railsを用いてポートフォリオサイトを作成することはできましたが、rubyの基礎知識の部分を忘れていることが多く面接の時に苦労したため、今後は基礎知識の部分を重点的に学習していきます。

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

オブジェクト指向におけるクラスの概念(Ruby)

クラスとインスタンス

 クラスは、インスタンスを作成する時に「元となる設計図」のことで、インスタンスは、設計図をもとに作成される実物体のことをいいます。

用語 役割 例1 例2
クラス 設計図 車の設計図 たい焼きの型
インスタンス 設計図をもとに作成される実物体 黒い車、赤い車 クリームのたい焼き、あんこのたい焼き

 Rubyは、「もの」を組み立てるように表現してコンピュータに指示するオブジェクト指向プログラミング言語です。「もの」を組み立てる際の設計図が「クラス」で、その設計図から作成された実物体のことを「インスタンス」と呼びます。

オブジェクト指向プログラミング言語

 プログラミングとは、コンピュータが理解できる言葉を並べてプログラムを作ることです。その際に、プログラムの意図したことを順番通りにコンピュータに動作させる指示を出しています。
 プログラムの意図したことを順番通りに表現する代表的な方法は以下の通りです。

プログラムの表現方法 プログラムの流れ
オブジェクト指向プログラミング 「もの」を組み立てる様に表現してコンピュータに指示する
手続き型プログラミング プログラムを上から順番に処理を実行する
関数型プログラミング 関数の組み合わせによってプログラムを組み立てる様に表現する

 このプログラムの表現方法の中で、Rubyは、オブジェクト指向プログラミング言語です。
 物を組み立てコンピュータを動作させるために、物の設計図であるクラスと物の実物体であるオブジェクトが必要です。

ポイント

①Rubyはオブジェクト指向プログラミング言語です。
②オブジェクト指向とは、「もの」を組み立てるように表現してコンピュータに指示するプログラムの表現方法
③物を組み立てプログラムを表現するために、物の設計図であるクラスと設計図から作成される実物体のインスタンスが必要です。

メソッドの特徴を理解しよう

 メソッドとは、複数の処理を1つにまとめて、扱いやすくしたものです。
 メソッドの基本的な書き方は、以下の通りになリます。

def メソッド名
  # 処理
end

# メソッド実行
メソッド名

 例)helloメソッドを定義して実行する

def hello
  puts "hello!"
end

# helloメソッド実行
hello
# => hello!

メソッドの特徴

 メソッドは下記のような特徴があります。
①メソッドに値を渡すことができる
②メソッド内で最後に評価される値を返す

def hello(name)
  puts "#{name},hello!"  ここがメソッド内で最後に評価されている
end

# helloメソッド実行
hello("kaito")
# => kaito,hello!

③メソッド内で定義した変数は、外部からアクセスすることができない

# メソッド内に変数を追加
def hello
  other_name = kaito
  puts "hello!"
end

# メソッド内の変数のather_nameをメソッド外から指定するとエラーが出る
puts other_name
# => NameError: undefind localvariable or method 'other_name' for main:object

クラスの作り方

 「たい焼きのイメージ」と「メソッドの特徴」を踏まえた上でクラスを作成します。

クラス作成

 クラスの定義は、以下のように記述します。

class クラス名
  # メソッドなど
end

 ここで重要なのは、メソッドの時と違いクラス名の最初の文字が大文字ということです。

class Taiyaki

  def メソッド
  end

end

インスタンス作成

 インスタンスは、以下のようにクラスから作成します。

クラス名.new

 たい焼きの型からたい焼きを作り出すには、以下のように記述します。

class Taiyaki

  def メソッド
  end

end

# たい焼きの設計図からたい焼きを作成
taiyaki = Taiyaki.new
# => <Taiyaki:0x00~>

 Taiyaki.newの返り値が、「Taiyaki:0x00~」なので、たい焼きのインスタンス(オブジェクト)が作成されたことがわかります。

initializeメソッドとインスタンス変数

 たい焼きを作ることができましたが、このままではたい焼きの味(taste)や値段(price)がわかりません。たい焼きに情報を持たせるためにインスタンス作成時に、たい焼きの情報を引数に渡します。

渡したいたい焼きの情報 インスタンス作成
あんこ味のたい焼き 250円 Taiyaki.new("あんこ", 250)
カスタード味のたい焼き 300円 Taiyaki.new("カスタード", 300)
抹茶味のたい焼き 330円 Taiyaki.new("抹茶", 330)

 引数で渡された値は、「インスタンス作成時」に実行されるinitializeメソッドを利用して「@のついたインスタンス変数」に代入します。

class Taiyaki

  # インスタンス作成の時に実行される
  def initialize(taste, price)
    # インスタンス変数には@をつける
    @taste = taste
    @price = price
  end

end

# newした際にinitializeメソッドが実行され、引数の値がインスタンス変数に代入される
anko_taiyaki = Taiyaki.new("あんこ", 250)
# => <Taiyaki:0x00~ @taste = "あんこ", @price = 250>

 インスタンスを作成するときに、initializeメソッド内でインスタンス変数に引数で渡した値を代入させることによって、インスタンス変数は、インスタンスごとに値を保持することができます。
 たい焼きを作りときは、それぞれのたい焼きごとに味や値段を変えることができます。

インスタンス作成 インスタンス変数の値の中身
Taiyaki.new("あんこ", 250) @taste="あんこ", @price=250
Taiyaki.new("カスタード", 300) @taste="カスタード", @price=300
Taiyaki.new("抹茶", 330) @taste="抹茶", @price=330

 メソッドの特徴として、メソッドの内で定義した変数はメソッドの外では利用できませんでしたが、インスタンス変数はインスタンス内であればどこでも呼び出すことができます。

インスタンスメソッド

 インスタンスメソッドとは、作成したインスタンスから実行できるメソッドのことです。
 先ほと作成したanko_taiyakiのインスタンスは、initizlizeメソッドでインスタンス変数に「@taste="あんこ", @price=250」を代入したため、この情報を保持してます。

 インスタンスメソッドは、このインスタンスごとに保持している情報を使って処理を書くことができます。

# たい焼きの設計図を作成
class Taiyaki

  # インスタンス作成時に実行される
  def initialize(taste, price)
    @taste = taste
    @price = price
  end

  # 作成したインスタンスから実行できるインスタンスメソッド
  # インスタンスによって、@taste,@priceの値が異なる
  def show_info
    puts "#{@taste}味のたい焼きは#{@price}円です。"
  end

end

# anko_taiyakiのインスタンス作成
anko_taiyaki = Taiyaki.new("あんこ", 250)
# => <Taiyaki:0x00~ @taste="あんこ", @price=250>

# 作成したanko_taiyakiのインスタンスからshow_infoインスタンスメソッドを実行する
anko_taiyaki.show_info
# => あんこ味のたい焼きは250円です。

 show_infoインスタンスメソッドは、作成したインスタンスによって文章の内容が異なります。これはインスタンスごとに保持するデータを変えることができるからです。
 試しにカスタード味のたい焼きを作って確認します。

custard_taiyaki = Taiyaki.new("カスタード", 300)
# <Taiyaki:0x00~ @taste="カスタード", @price=300>

custard_taiyaki.show_info
# カスタード味のたい焼きは300円です。

クラスメソッドの定義

 先程のインスタンスメソッドは、インスタンスから呼び出すことができましたが、その他にもクラスから呼び出すことができるクラスメソッドがあります。
 クラスメソッドとは、インスタンスに依存せずにクラス全体に紐付けられるメソッドのことです。インスタンスの持つデータを使う必要のない処理は、クラスメソッドで定義します。
 クラスメソッドは、2つの定義方法があります。

# クラスメソッドの定義方法1
class クラス名
  def self.クラスメソッド名
  end
end

# クラスメソッドの定義方法2
class クラス名
  # この中で定義するとクラスメソッドと認識されます。
  class << self
    # メソッド名にselfは必要ない
    def test
    end
  end
end

 クラスメソッドは、以下のように呼び出すことができます。

クラス名.クラスメソッド名

クラス変数

 インスタンス変数の他に、クラス変数という@が2つ付く変数があります。
 インスタンス変数が作成された各インスタンスごとに共有される変数だったのに対して、クラス変数は、全てのインスタンスで共有される変数です。
 たい焼きが全部で何個作成されたかわかるクラス変数「@@total_taiyaki_count」と、それを案内するクラスメソッドを定義します。

# たい焼きの設計図を作成
class Taiyaki

  # 全てのインスタンスで共有されるクラス変数
  @@total_taiyaki_count = 0

  # インスタンス作成時に実行される
  def initialize(taste, price)
    @taste = taste
    @price = price

    # インスタンスが作成(new)される毎にカウントアップ
    @total_taiyaki_count += 1
  end

  # インスタンスメソッド
  def show_info
    puts "#{taste}味のたい焼きは#{price}円です。"
  end

  # クラスメソッド
  def self.shoe_all_count
    puts "たい焼きは全部で#{@@total_taiyaki_count}個作成されました。"
  end

end

 クラス変数「@@total_taiyaki_count」によってTaiyakiクラスからインスタンスを作成する度に1ずつ増える為、たい焼きの作成した個数を知ることができます。

# anko_taiyakiのインスタンスを作成(カウントアップされる)
anko_taiyaki = Taiyaki.new("あんこ", 250)
# => <Taiyaki:0x00~ @taste="あんこ", @price=250>

# custard_taiyakiのインスタンスを作成(カウントアップされる)
custard_taiyaki = Taiyaki.new("カスタード", 300)
# => <Taiyaki:0x00~ @taste="カスタード", @price=300>

# たい焼きの個数を調べるためにshow_all_countクラスメソッドを実行する
Taiyaki.show_all_count
# => たい焼きは全部で2個作成されました。

終わりに

 今回は、クラスについて学習しました。railsを用いてポートフォリオサイトを作成することはできましたが、rubyの基礎知識の部分を忘れていることが多く面接の時に苦労したため、今後は基礎知識の部分を重点的に学習していきます。

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

Rubyでバイナリーリサーチ(二分探索)の実装

スクールのドリルでだいぶ苦戦したのでバイナリーリサーチの実装方法について整理します。

def binary_search(array, right, target)
  left = 0
  while left <= right
    # 要素の左端と右端を足して二分した値をcenterへ代入
    center = (left + right) / 2
    if array[center] == target
      # centerで指定した位置の配列の数字と検索したい数字が一致すれば
      # centerを返す
      return center
    elsif array[center] < target
      # centerで指定した位置の配列の数字より検索したい数字が大きい場合、
      # centerに1を足した数値を左端の位置を表すleftに代入
      left = center + 1
    else
      # centerで指定した位置の配列の数字より検索したい数字が大きい場合、
      # centerから1を引いた数値を右端の位置を表すrightに代入
      right = center - 1
    end
  end
  # 検索したい数字が配列の中の数字と一致しなかった場合、-1を返す
  return -1
end

array=[1,3,5,6,9,10,13,20,26,31]
number_of_elements = array.count

puts "検索したい数字を入力してください"
target = gets.to_i

result = binary_search(array, number_of_elements, target)

if result == -1
  puts "#{target}は配列内に存在しません"
else
  puts "#{target}は配列の#{result}番目に存在します"
end

たとえば26を検索したい場合、以下の動きをします。

# whileの1回目のループ
center = ( 0 + 9 ) / 2 = 4 # 計算結果の小数点以下は切り捨てられる
array[4] = 9 < 26
left = 4 + 1 = 5

# whileの2回目のループ
center = ( 4 + 9 ) / 2 = 6
array[6] = 13 < 26
left = 6 + 1 = 7

# whileの3回目のループ
center = ( 6 + 9 ) / 2 = 7
array[7] = 20 < 26
left = 7 + 1 = 8

# whileの4回目のループ
center = ( 8 + 9 ) / 2 = 8
array[8] = 26 == 26
return 8

# 実行結果=>"26は配列の8番目に存在します。"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【rails】忘れがち!!localhostサーバーのプロセスが切れない時!!

今回はターミナルでローカルサーバーを起動した時に出るトラブルを対処した時のお話です。

たまになるのですが忘れるのでメモメモ!!

ターミナル
rails s

とした時に!!

ターミナル
Run rails server --help` for more startup options

と出た時のお話ですね(´∇`)

結論的にはkillコマンドなのですが、毎回その番号がどこにあったかを忘れてしまいます(アルツ?)

どこだったかな?とゴソゴソしていましたが見つけましたw

tmp>pids>server.pid
<ここに出てきるプロセス番号!!>

このプロセス番号にkillコマンド!!

ターミナル
kill -9 プロセス番号

これでrails sをすると再起動ですね(´∇`)

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

子供の遊び場共有サービス「Crayfisher」

Ruby on Railsで子供の遊び場共有サービスを開発しました。

スクリーンショット 2021-01-15 15.18.31.png

使用した技術に関する記事を後学のため&備忘録として書き残しておきます。

_________以下概要_________

Crayfisherは子供の遊び場スポットを共有するサービスです。 ザリガニ釣りスポット、クワガタの取れる木、トカゲがいる場所、ネットでは出てこない遊び場スポットを知りたい時、是非Crayfisherを是非ご利用ください。

また、子供の頃よく行っていた遊び場があれば全国のお母さん、お父さんたちのために是非共有してください。

url : https://crayfisher.herokuapp.com/

ログイン用

メールアドレス:example@example.com
パスワード:foobar

■ 実装機能
* 記事投稿機能(位置情報、コメント)
* 地名による地図検索機能
* 認証機能(devise)
* ページネーション機能
* アプリケーション内で使用している技術
* Rspecを使用した自動テスト
* Ransackを利用した検索機能
* rubocopを使用した静的コード解析ツール
* CircleCIによる継続的インテグレーション
* Dockerによる環境構築
* Googlemap API
* S3を利用したクラウドストレージ
* gem "bullet"を利用したN+1問題の検出・解決
* sass, slimを使用した記述

■ 環境
* ホストOS : MacOS
* データベース:Postgresql
* 言語 : HTML CSS(SCSS) JavaScript Ruby SQL
* フレームワーク : Ruby on Rails
* CSSフレームワーク : bootstrap
* JSライブラリ : jQuery
* インフラ : heroku Docker AWS S3
* テストフレームワーク : RSpec
* その他ツールなど : Git Github Rubocop CircleCI
*

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

【rails】font-awesomeでformにアイコンを使った時のメモ

下の画像の『ファイルを選択』をカメラアイコンにした時のメモです!
補足などありましたらお願いします_:(´ཀ`」 ∠):

form基礎画像.png

font-awesome(フォントオーサム)を使う!

【font-awesomeへの初回認識】
1.awesomeをずっとアウェサムと読んでいたww(意外と多い?多くない?)
2.初回railsで検索したのでRuby On Rails用だと考えていた。

検索した際にrailsで検索したのでrails専用の物だと勘違いしていましたが、違いますよね?(多分)

aplication.scssに以下の項目を記載しようとしたら間違えてactiontext.scssに記述しましたが動きました。

actiontext.scss
 $fa-font-path: '@fortawesome/fontawesome-free/webfonts';
@import '@fortawesome/fontawesome-free/scss/fontawesome';
@import '@fortawesome/fontawesome-free/scss/solid';
@import '@fortawesome/fontawesome-free/scss/regular';
@import '@fortawesome/fontawesome-free/scss/brands';
@import '@fortawesome/fontawesome-free/scss/v4-shims';

動くんだろうけどこうした方が良いとかありましたら教えていただけると幸いです。
以下も記載します。

javascript>packs>application.js
import '@font-awesome/fontawesome-free/js/all';

font-awesomeのサイトで無料登録をする!

タイトル通り無料登録します!
無料でもかなりのアイコンが使えるのはありがたいですね(´∇`)

1.登録が完了したらログインします。
2.『How to Use』の場所にある『Add Your Kit's Code to a Project』を確認!
3.『Copy Kit Code!』でコピーして貼り付けます!

application.html.erb
<script src="https://kit.fontawesome.com/2f8d319b58.js" crossorigin="anonymous"></script>

これで準備完了です(o^^o)

アイコンを使おう!

それではアイコンを書いていきます!
camera.icon.png

ちょっと見にくいかもですが、コードは画像の真上にあります。

<i class="fas fa-camera"></i>

この記述でアイコンが設置できます。
あとはcssで見た目を整えるととりあえず完成です。

ですが、このアイコンをクリックすると動くようにしたいですよね?

formオブジェクトのfile_fieldにアイコンを付けたい!

ここからが個人的にどうするんだろうとずっと頭を悩ませましたww

最終的には以下のようになりました(´∇`)

 <%= f.label :image, class:"form-image-label" do %>
   <i class="fas fa-camera"></i>
     <%= f.file_field :image, class:"message-hidden" %>
 <% end %>

1.<%= f.label〜do%>でブロックを作成。
2.その中にアイコンのhtmlとfile_fieldを書いてあげたら完成!!

labelの使い方、ブロックの使い方をよくわかっていなかったので長々と苦戦しましたが上手く動いてくれて良かったです!!

内容的に理解不足、雑などあると思いますがメモ帳代わりなのでもし見た方は許してください。

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

Developers Summit 2021に開発責任者 柴戸の登壇が決定!

日本最大級のデベロッパーの祭典 DevSumi2021

2021年2月18日(木)・19(金)の2日間で開催が予定されている国内最大級のITエンジニア向けイベント「Developers Summit 2021」に当社の開発責任者柴戸が登壇いたします。また、リンクアンドモチベーションとしてはこの度シルバースポンサーとして参加させていただきます!

スクリーンショット 2021-01-26 18.27.57.png

登壇内容

19-B-8 02/19(金) 16:25 ~ 17:05

ARR20億円を3年で達成したエンジニア組織が実現した3つのDeveloper eXperience~訪れる壁と突破方法~

Developers Summit 2021では、リンクアンドモチベーション初のエンジニアとして入社した柴戸より、社員エンジニア1名から組織を拡大していくにあたり、ぶつかった壁やその乗り越え方を、挑戦と葛藤のリアルエピソードを交えながらお話しします。

現在、国内初の組織改善クラウド「モチベーションクラウドシリーズ」は、2016年にリリース後、ARR(年間経常収益)20億円を3年で達成し成長を続けています。開発組織の内製化に舵を切った2018年から、どのような変化があったのか…ご興味のある方は、是非お申し込みください!

▼お申込み・詳細はコチラ
Developers Summit 2021公式ページ

登壇者紹介

柴戸 純也

株式会社リンクアンドモチベーション
ビジネスデザインユニット 開発責任者

大手IT企業を経て、フリーランスとして技術力を磨いた後、前職のアドテク系ベンチャー企業で執行役員(Vp of Engineering )を勤め、企業を上場へと導く。2018年に「良い会社の定義を変える」というミッションに共感し、リンクアンドモチベーションに入社。現在は、モチベーションクラウドシリーズの開発責任者を務めると同時に、グループ全体のDXを牽引。テクノロジーの力で「第二の創業」を推進している。`

? 開発責任者 柴戸の関連記事
大手企業などを中心に5,000社超のデータを基にした自社プロダクトを自らの手で。エンジニア中途一号、柴戸に迫る。

【キャディ社とのCTO対談】 人事領域のプロフェッショナル組織がエンジニアリング組織を作るとどうなるか

「Developers Summit 2021」開催概要

 日時:2/18(木)9:50~18:20予定
    2/19(金)9:50~18:15予定
 会場:オンライン
 参加費:無料(事前登録制)
 URL:https://event.shoeisha.jp/devsumi/20210218

Developers Summitは、翔泳社主催で行われる日本最大級のソフトウェアデベロッパーカンファレンスの一つです。各企業で活躍されている方々のセミナーを通して、日本のITエンジニアが活気づくことを目指している「エンジニアの祭典」となりますので、私たちリンクアンドモチベーションもカンファレンスを盛り上げて行きたいと思います!

エンジニアの皆さま、オンライン会場でお会いしましょう!

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

Rails 非同期通信 メッセージ機能の実装

メッセージの非同期通信の実装

メッセージの非同期にあたり大きく分けて二つの機能を実装しました、

一つは非同期通信のメッセージ送信です。

二つ目はメッセージの受信(自動更新機能)です。

今回はJavaScriptのみのコードを公開しております。途中に参考にした記事などを掲載しております。そちらを参照していただければと思います。

その前に非同期通信とは?

コンピュータ間でデータ送信と受信のタイミングを合わせずに行う通信手段である。片方がオンライン状態であれば、データの送受信を行うことができる。
反対に同期通信というものがある。
同期通信とは、送信側も受信側もオンラインである必要があり、片方が接続してれば通信を行える非同期通信とは大きく違う点である。

それを踏まえて一つ目のメッセージの送信について、

$(document).on('turbolinks:load', function(){
    function buildHTML(message) {
      var content = message.content ? `${ message.content }` : "";
      var img = message.image ? `<img src= ${ message.image }>` : "";
      var html = `<div class= "message" data-message-id=${message.id}>
                    <div class="upper-message">
                      <p class="message-user">
                        ${message.user_name}
                      </p>
                      <p class="message-date">
                        ${message.date}
                      </p>
                    </div>
                    <p class="lower-message">
                      <div class="message-content">
                      ${content}
                      </div>
                    </p>
                  </div>`
    return html;
    }
    $('#new_message').on('submit', function(e){
      e.preventDefault();
      var message = new FormData(this);
      var url = (window.location.href);
      $.ajax({
        url: url,
        type: 'POST',
        data: message,
        dataType: 'json',
        processData: false,
        contentType: false
      })
      .done(function(data){
        var html = buildHTML(data);
        $('.messages').append(html);
        $('#message_content').val('');
        scrollBottom();

      })
      .fail(function(data){
        alert('エラーが発生したためメッセージは送信できませんでした。');
      })
      .always(function(data){
        $('.form-submit').prop('disabled', false);
      })
    })

こちらに関するコードは下記のURLを参考にして実装いたしました、この方の記事を読んだ方が効率がいいので参考にしていただければと思います。
(引用https://qiita.com/mmmasuke/items/36365bcdf30eaea65250)

二つ目のメッセージの受信(自動更新機能)について

    var reloadMessages = function(){
      var href = 'api/messages#index {:format=>"json"}'
      var last_message_id = $('.message:last').data('message-id');
      $.ajax({
        url: href,
        type: 'GET',
        data: {id: last_message_id},
        dataType: 'json',
      })
      .done(function(messages) {
        if (messages.length !== 0) {
          var insertHTML = '';
          $.each(messages, function(i, message) {
            insertHTML += buildHTML(message)
          });
          $('.messages').append(insertHTML);
          $('.messages').animate({ scrollTop: $('.messages')[0].scrollHeight});
        }
      })
      .fail(function(){
        alert("自動更新に失敗しました")
      });
    };
  if (document.location.href.match(/\/rooms\/\d+\/messages/)){
    setInterval(reloadMessages, 7000)};
});

  function scrollBottom(){
    var target = $('.message').last();
    var position = target.offset().top + $('.messages').scrollTop();
    $('.messages').animate({
      scrollTop: position
    }, 300, 'swing');
  }

こちらのコードは
(引用https://qiita.com/AK4747471/items/cc0ba52b6ed34f0b4b8c)
こちらの記事を参考に実装いたしました。

ただの感想

実装にあたり、自身が送信のみで非同期通信を実装できたと勘違いしておりました。メッセージの非同期通信には自動更新は必須です。

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

【クラスとインスタンスの比喩】

お初にお目にかかります。

ここでは私自身が咀嚼した知識を吐き出してまいります。
青々しく酸っぱいのであまり参考にしないでください。
たで、同じように解釈や比喩について悩んでいる方の一助になれたら幸いです。

2021年1月22日

1、クラス
 クラスとは、個々にデータを持たせるための雛形である。具体的な実体を持っておらず、クラスに共通する属性やメソッドを用いてインスタンス(後述)を作成する。
 例えば、街を行き交う人に「紙の上に三角形を書いてください」と注文する。その際に各人が頭に思い描く「三角形」が、いわば設計図であるクラスと呼べるだろう。人々がどのような三角形をイメージしていても、一般的に共通する特徴はある。線が三本である、直線で描かれている、などだ。
 また、紙上へ出力するための手段がある。鉛筆を使う人もいる一方で、絵筆で描いたりする人もいる。
 この場合特徴は「属性」へ、手段は「メソッド」としてプログラミング上で扱われる。



2、インスタンス
 インスタンスとは、クラスを用いて作成され、それぞれが個別のデータを持つものである。クラスによって作成されたインスタンスは、前述の例を用いて表すならば「人々が実際に書いた三角形」であると言えよう。
 概念から生み出された三角形は、個々人によって様々である。鉛筆を用いて細い小さな一本の線で描いた者もいれば、太いマジックペンで豪快な線を描く者もいる。この場合の描かれた三角形は様々な特徴を持ち、姿は異なる。
 こうして描かれた三角形は、概念上の「三角形」、すなわちクラスから生み出され、様々なメソッドや属性を用いることでインスタンスとして表出する。

2021年1月27日

1、クラス
クラスは、インスタンスを生成するために定義される。それ自体に実体はない。
例えるならば、たいやきというインスタンスを作り出すための「たい焼き器」であると言える。たい焼きの種類はどうあれ、「鯛」の形を成し、熱によって加工される工程は共通のルールとして定義される。


2、インスタンス
インスタンスはクラスから生成され、個々に異なる値を持つものである。
上記の例示を引用するならば、クラスから作り出された「たいやき」である。
素材によってスタンダードなたいやき、白いたいやき、また、中身もあんこやクリームといったように、様々な特徴を持ったインスタンスが作り出される。
この場合の素材は「属性」、見た目や味といった特徴は「値」と言い換えられる

ここまで読んでいただけた奇特な貴方に感謝申し上げます。
また、なにか解釈違いや見当違い等ございましたら、ぜひともご教授いただけますと幸いです。

鍵谷

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

【Rails】プルダウン検索編 ransackを導入して検索機能を作成する

はじめに

保存したデータを項目事に分けて表示することで、欲しいデータのみ手に入れたい。
そんな時はransackです。

目次

  1. ランサック導入
  2. ルーティング設定
  3. モデル
  4. コントローラー
  5. ビュー
  6. 重複の解消
  7. 検索結果ページを作る

開発環境

ruby 2.6.5
Rails 6.0.3.4
ransack 2.3.2

1. ランサック導入

Ginfile
gem 'ransack'
ターミナル
bundle install

2. ルーティング設定

今回はdemosコントローラーを使用し、アクション名はsearchするので、get 'demos/search'を記述します。

routes.rb
  root to: demos#index'
  resources :demos
  get 'demos/search' #ここransakuのルーティング

3. モデル

今回はdemoモデルとします。マイグレーションファイルを編集します。

db/2020XXXXXXXXX_create_demos.rb
class CreateDemos < ActiveRecord::Migration[6.0]
  def change
    create_table :demos do |t|
      t.string     :sample_name
      t.string     :sample_kana
      t.string     :sample_email
      t.string     :sample_tel
      t.string     :sample_product_name
      t.string     :price
      t.integer    :num_id
      t.datetime   :start_time
      t.integer    :sample_id,             null: false

      t.timestamps
    end
  end
end

今回は上記の項目を保存します。

ターミナル
rails db:migrate

サンプルデータは自分で作成するか、「seed」を使います。
seedの使い方は下記の記事を参考にしてみてください。

【Rails】seedとFakerでランダムなサンプルデータを作成
https://qiita.com/AKI3/items/189574314ca94e8f43c6

4. コントローラー

今回コントローラーはdemosという名前です。

app/controlers/demos_controller.rb
class DemosController < ApplicationController
  before_action :search_demo, only: [:index, :search]

  def index
    @demos = Demo.all
  end

  def search
    @results = @d.result
  end

  private

  def search_demo
    @d = Demo.ransack(params[:q])  # 検索オブジェクトを生成
  end
end

検索パラメーターのキーを「:q」とします。この「:q」とは「query(質問する)」のイニシャルのことです。

次に、:qを使って、demosテーブルから商品情報を探しています。そして、「@d」という名前の検索オブジェクトを生成しています。
この処理を行うメソッド名を「search_demo」としています。

最後にこの@dに対して「.result」とすることで、検索結果を取得しています。
これは、検索条件に該当した商品が@dに格納されているので、その格納されている値を表示する役割があります。

5. ビュー

ビューに検索するバーを作成します。

app/views/demos/index.html.erb
    <div class="search-data">
      <h3>商品検索</h3>
      <%= search_form_for @d, url: demos_search_path do |f| %>
        <%= f.label :sample_product_name_eq, '商品検索' %>
        <%= f.collection_select :sample_product_name_eq, @demo, :sample_product_name, :sample_product_name,  include_blank: '指定なし' %>
        <%= f.submit '検索' %>
      <% end %>
    </div>

まず、search_form_forの引数に「@d」を渡すことで検索フォームを生成します。
「_eq」は条件検索を行うための記述です。
続いて、<%= f.collection_select 第一引数, 第二引数, 第三引数, 第四引数, 第五引数, オプション %>の順で並んでいます。

できたらリロードしてプルダウンを確認します。

ここを自分の言葉に編集

1 2 3
第一引数(メソッド名) :name_eq ・カラム名・name属性やid属性を決める
第二引数(オブジェクト) @demo 配列データを指定する
第三引数(value) name 表示する際に参照するDBのカラム名
第四引数(name) name 実際に表示されるカラム名
オプション include_blank 何も選択していない時に表示される内容

6. 重複の解消

このままだとこのように商品名が重複しています。
これを解消する為にコントローラーに以下を追記します。

app/controlers/demos_controller.rb
#省略
  def index
    @demos = Demo.all
    set_demo_column #←追記
  end

#省略
private
  def set_demo_column
    @demo_date = Demo.select("sample_product_name").distinct  # 重複なくnameカラムのデータを取り出す
  end

html.erbも@demo_dateに変更します。

app/views/demos/index.html.erb
<%= f.collection_select :start_time_eq, @demo_date, :start_time, :start_time,  include_blank: '指定なし' %>

7. 検索結果ページを作る

最後に検索ページを作成します。

app/views/demos/search.html.erb
<h1>検索結果</h1>
<% if @results.length !=0 %>
  <% @results.each do |result| %>
    <td>
    <br>
    <li>
      <%= result.sample_name %>
      <%= result.sample_kana %>
      <%= result.sample_email %>
      <%= result.sample_tel %>
      <%= result.sample_product_name %>
      <%= result.price %>
      <%= result.num_id %>
      <%= result.start_time %>
      <%= result.created_at %>
    </li>
  <% end %>
<% else %>
  該当する商品はありません
<% end %>
<br>
<%= link_to 'トップページへ戻る', root_path %>

表示されれば完成です!

まとめ

本記事では、RANSACKを導入してプルダウン検索機能を作成する方法を紹介しました。
今後別の検索機能も実装していきます。

最後に

同じ様に悩んでる方々の助けになればと思い、記事を投稿しております。
それでは、また次回お会いしましょう〜

参考

【公式】
https://github.com/activerecord-hackery/ransack

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

【Ruby on Rails】nilチェックは「==」を使わずスマートに

人間はすぐに忘れるモノ...

はいだから書きます。
レビューで指摘していただいた10分後に書いています(笑)

いつもの癖ですぐに使ってしまう下記の様なコード。

if hoge == nil
  #処理があって
end

すぐに「==」演算子を仕様する癖が染み付いていますのでここで矯正。

if hoge.nil?
  #処理があって
end

以上です。これでもう同じことはしない。

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

トランザクション中にrescueするとロールバックしないので注意!

トランザクション中のrescueはロールバックを発生させない

動画による説明

[Ruby on Rails] トランザクション中のrescueには気をつけて

トランザクション中のrescue

このようにすると、create!で発生した例外をキャッチして、exec_transactionの返り値としてfalseを返すことができます。

def exec_transaction
  ApplicationRecord.transaction do
    User.create!(name: 'Duplicate')
    User.create!(name: 'Duplicate')
  rescue ActiveRecord::RecordInvalid
    false
  end
end

Userモデルは下記のようにバリデーションが設定してあります。

class User < ApplicationRecord
  validates :name, uniqueness: true
end

このコードを実行すると、二回目のcreate!でエラーが発生しますが、ロールバック処理が実行されません

Rollbackが起きる仕組み

transactionメソッドに与えられたブロックは、最終的にwithin_new_transactionメソッドの中で実行されます。
ここで、与えられたブロックで発生したすべての例外をキャッチして、ロールバックを発生させたあと、例外をもう一度送出します。

activerecord/lib/active_record/connection_adapters/abstract/transaction.rb#L313-L318

この動作によって、transactionで例外が発生すると、ロールバックが暗黙的に実行されて、例外の送出も行われます。

Exceptionをキャッチするとロールバックしない

上述の通り、発生した例外をトリガーにしてロールバックが発生します。したがって、先に示したコードのようにブロックの中で例外をキャッチしてしまうと、ロールバックが起きません。

ロールバックしつつ例外をキャッチしたい場合

方法は二通り。明示的にロールバックするか、トランザクションの外側で例外をキャッチする。

明示的にロールバック

こちらの動画で紹介されている方法と同じ考え方です。
https://www.youtube.com/watch?v=jFBvEQhApKQ

ActiveRecord::Rollbackを送出してロールバックを行い、全て正常終了したかどうかを返り値とします。

def exec_transaction
  success = true
  ApplicationRecord.transaction do
    success &= User.create(name: 'Duplicate')
    success &= User.create(name: 'Duplicate')
    unless success do
       raise ActiveRecord::Rollback
    end
  end

  success
end

トランザクションの外側で例外をキャッチする

ロールバックが発生したら例外は再度送出される、という性質を利用します。

def exec_transaction
  ApplicationRecord.transaction do
    User.create!(name: 'Duplicate')
    User.create!(name: 'Duplicate')
  end
rescue ActiveRecord::RecordInvalid
  false
end

そもそもの例外処理の設計

こういう例外処理がある事自体が良くない可能性もあります。もちろん、すべてが悪いということではないです。
エラー処理の設計については、下記の資料で非常に丁寧にまとめられています。

Railsアプリケーションにおけるエラー処理(例外設計)の考え方
プロを目指す人のための例外処理(再)入門 / #rubykansai 2018-01-13

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

【Ruby】even?メソッド

はじめに

備忘録の記述です。今回は、配列にある値の中から偶数の数をカウントして出力するメソッドを作りました。

出力例:count_evens([2,1,2,3,4]) → 3

偶数かどうかを判断するメソッドとして「even?」を使用します。
リファレンスマニュアル

解答

practice.rb
def count_evens(nums)
  count = 0
  nums.each do |num|
    if num.even?
      count += 1
    end
  end
  puts count
end

count_evens([2, 1, 2, 3, 4])

「count = 0」:配列の中の偶数の値を出力するためにカウントした数を保存するための変数が必要なため、ここで定義をしています。

「nums.each do |num|」:配列に入っている数字をeach文で取り出し、even?メソッドで1つずつ偶数かどうかを確認しています。偶数だった場合は、countに1を足していきます。

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

Rubyのハッシュとシンボル、キーの関係について、わかりやすく解説する

曖昧な理解になってしまいがちな「ハッシュ」「シンボル」について、解説していきます。
Rubyを勉強し始めた時は全然わからなかった。。

この記事を通して
・ハッシュとキーの関係がわかる
・シンボルの使い方がわかる
ようになれば幸いです。

ハッシュは、「関連付いた名前をつけて、データを格納したいとき」に使う

数学のテストがあって、データが点数順に並んでいるとします。

 score = [56,43,55,78,79,66,73,90,45,65,43,25]

ここで、taro君の点数を知ろうとしたとき「score」というデータだけではわかりませんよね。「name」という、データに関連付いた名前が必要になってきます。

ここで、ハッシュの登場です。
ハッシュとは、「関連付いた名前をつけて、データを格納したいとき」に使うことができます。

{ :name => score }    #今回の例であれば { :taro => 56 }

このような形でハッシュを作ることができます。これでtaro君の点数を知ることができるようになりました。

データに関連付いた名前のことを「キー」と呼ぶ

「:taro」の部分をキーと呼びます。キー(データに関連付いた名前)とデータのセットであるハッシュを格納するわけですね。

キーは、文字列、時間、数字など、任意のオブジェクトを使うことできますが、「シンボル」と呼ばれる、コロンではじまる識別子をよく使います。(例 => :taro)

またキーとデータの間の区切りにコロンを使えば、シンボル名の頭のコロンを省略することができます。

# ①文字列
"taro" => 56
# ②シンボル
:taro => 56
# ③一番良く使う表記
taro : 56

①、②、③は同じ意味になります

シンボルは「何かしらの名前を表す存在だよ」ということを示しています。

「:taro」になったり、「taro:」になったりして、コロンに惑わされると思うのですが、①、②、③が同じであることがわかれば安心かと思います。

まとめ

以上、ハッシュとシンボル、キーの関係について、解説していきました。

・「ハッシュ」・・・「関連付いた名前をつけて、データを格納したいとき」に使う
・「キー」・・・データに関連付いた名前
・「シンボル」・・・コロンではじまる識別子を使ったキー

この3点をおさえていきましょう。


この記事の説明がわかりやすかった!ここ間違ってるよ!次こんな記事を書いて欲しい!などあればコメント、DMよろしくお願いします。LGTMもぜひ。

Twitterもやってますので、フォローしていただけたらうれしいです。
卓球、心理学、哲学、Webサービス、好きな音楽、カメラ、登山、ランニング、読んだ本などなんでもつぶやいてます。

[https://twitter.com/atsushi101011]

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

Railsチュートリアルの1.5.2でRubyのバージョンがHerokuに対応していないと言われた

IDEはRailsチュートリアルに則りAWS Cloud9のものを使用。
Gemfileの内容は以下のとおり。

Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.3'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '6.0.3'
# Use Puma as the app server
gem 'puma', '4.3.6'
# Use SCSS for stylesheets
gem 'sass-rails', '5.1.0'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '4.0.7'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '5.2.0'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '2.9.1'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '1.4.5', require: false

group :development, :test do
  # Use sqlite3 as the database for Active Record
  gem 'sqlite3', '1.4.1'
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', '11.0.1', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '4.0.1'
  gem 'listen', '3.1.5'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring', '2.1.0'
  gem 'spring-watcher-listen', '2.0.1'
end

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '3.28.0'
  gem 'selenium-webdriver', '3.142.4'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers', '4.1.2'
end

group :production do
  gem 'pg', '1.1.4'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]'

これで以下のコマンドを実行した。

$ git push heroku master

すると以下のように表示された

...

remote:  !
remote:  !     The Ruby version you are trying to install does not exist on this stack.
remote:  !     
remote:  !     You are trying to install ruby-2.6.3 on heroku-20.
remote:  !     
remote:  !     Ruby ruby-2.6.3 is present on the following stacks:
remote:  !     
remote:  !     - cedar-14
remote:  !     - heroku-16
remote:  !     - heroku-18
remote:  !     
remote:  !     Heroku recommends you use the latest supported Ruby version listed here:
remote:  !     https://devcenter.heroku.com/articles/ruby-support#supported-runtimes
remote:  !     
remote:  !     For more information on syntax for declaring a Ruby version see:
remote:  !     https://devcenter.heroku.com/articles/ruby-versions
remote:  !

...

どうやらRalisチュートリアルで使っているRubyのバージョンがHerokuに対応していないので、ここに載っているバージョンを使ってほしいということらしい
https://devcenter.heroku.com/articles/ruby-support#supported-runtimes

早速以下のようにGemfileを書き換えた。
要するにrubyのバージョンを変えただけ。

Gemfile
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }

ruby '2.6.6'

# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '6.0.3'
# Use Puma as the app server
gem 'puma', '4.3.6'
# Use SCSS for stylesheets
gem 'sass-rails', '5.1.0'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '4.0.7'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '5.2.0'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '2.9.1'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'

# Use Active Storage variant
# gem 'image_processing', '~> 1.2'

# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '1.4.5', require: false

group :development, :test do
  # Use sqlite3 as the database for Active Record
  gem 'sqlite3', '1.4.1'
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', '11.0.1', platforms: [:mri, :mingw, :x64_mingw]
end

group :development do
  # Access an interactive console on exception pages or by calling 'console' anywhere in the code.
  gem 'web-console', '4.0.1'
  gem 'listen', '3.1.5'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring', '2.1.0'
  gem 'spring-watcher-listen', '2.0.1'
end

group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '3.28.0'
  gem 'selenium-webdriver', '3.142.4'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers', '4.1.2'
end

group :production do
  gem 'pg', '1.1.4'
end

# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

あとは下記のコマンドを実行してデプロイすればOK

$ bundle update
$ git commit -a -m "RubyのバージョンをHerokuに対応している2.6.6に変更"
$ git push heroku master

Railsチュートリアルの1.3.1ではGemfileのRubyのバージョンを2.6.3としていたが、どこかで変更しているのを私が見落としたのだろうか?

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

「Undifined method 'upload' for nil:NilClass」エラーの対処

概要

Active Storageを利用する際に、「Undifined method 'upload' for nil:NilClass」エラーが出る。

状況

  1. rails version -5.2.2.4でアプリケーションを作成
  2. ActiveStorageをインストール
  3. Model, Controller, Viewファイル作成
  4. ブラウザでファイルのアップデートを実行すると、概要のエラーが発生

解決策

https://qiita.com/NaokiIshimura/items/c8aa4d55cb653ff0501a

こちらの記事と全く同じ症状であることが発覚。
同様の対処法で解決した。

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