20190512のRubyに関する記事は15件です。

Railsのattributeはバリデーションではなくキャスト

どうも、ITのんびりです

モデルに書くattributeの意味がいまいち分かっていなかったので、調べてみました

使用例

attribute :id, :integer

こんな感じでパラメーター名と型を書きますよね
最近まで意味がよく分からず、「idのデータ型をintegerに限定しているのかなあ」と何となく思っていました

バリデーションではなくキャスト

attributeはバリデーションを設定しているのではなく、指定した型以外のデータが送られてきたら指定した型に変換(キャスト)します

attribute(name, cast_type = Type::Value.new, **options)

cast_typeで指定したtypeではない型のデータが飛んできたら指定したtypeにcastします

attribute :id, :integer

integerで指定して10.1がきたら10にcastします

attribute :flag, :bool

boolで指定して"false"という文字列が飛んできたらbooleanのfalseにcastします

バリデーションとの順番

attributeでキャストしてからvalidationが判定されるようです

attribute :id, :integer
validates :id, numericality: { only_integer: true }

idを整数にcastして、整数のバリデーションをかけるとします
idが10.1で送られてきたら、attributeで10にcastされます
idが10で整数なので、only_integer: trueのバリデーションは通ります

整数のバリデーションをかけているのに、10.1が送られてきてバリデーションが通るのはよくないですね(10にcastされているとはいえ)

バリデーションをかけるときは、castの影響を考えてするようにしましょう

参考記事

Rails5: ActiveRecord標準のattributes API(翻訳)

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

これは便利!1つのコマンドでHaml変換できる【Ruby on Rails】

目次

  • gemを追記する(Hamlを導入する)
  • html.erbファイルを一括で変換する

gemを追記する(Hamlを導入する)

Gemfile
gem 'haml-rails'
gem 'erb2haml'

※(注意点)テスト環境と開発環境以外に追記する

ターミナル
$ bundle install

gemを記述したらこのプロセスを忘れてはいけませんでしたね!

html.erbファイルを一括で変換する

$ rake haml:replace_erbs

この処理が終わり、html.erbファイルが下記のようにHaml変換されていれば成功です。

!!!
%html
  %head
    %meta{:content => "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
    %title ChatSpace
    = csrf_meta_tags
    = stylesheet_link_tag    'application', media: 'all', 'data-turbolinks-track': 'reload'
    = javascript_include_tag 'application', 'data-turbolinks-track': 'reload'
  %body
    = yield

END

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

Railsでアプリ開発〜1日目〜

どんなアプリ?


名前

  • schedun(スケジュン)

内容

  • 勉強などのスケジュールアプリ。
  • 親と子アカウントを作成し、親が出したスケジュールに対して子供が行動。
  • 親との会話も可。

今日の目標

環境構築

様子

  1. どのように環境を構築していくか
    • Docker
    • CentOS
    • Ubuntu

ubuntu

  • 参考書通りにインストール → できない!エラー発生! → なし

docker

  • dockerのwindows版いれる→ Proじゃないのでできない → なし

centos

  • これしかないので頑張ってインストール

1つ目のエラー

Postgresqlを無事にインストールして、
Rails new schedun -d postgresql
としてみました。
そうすると、
pgがありません
と言われたので書いてある通りインストール → まだエラー
小1時間考えて見て、結局、sqliteにしました。

次にやること

  • それぞれのビュー、コントローラーなどを作成
  • 画面のレイアウトを作成
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gretelをつかわずにRailsでパンくずリストを作成

パンくずリストとは

こういうやつです。
Image from Gyazo

gretelというgemを使うとスッキリ作れるみたいなのですが、当時このgemを知らなかったたま力技で作りました。

ページを判断するメソッド

ページごとにリストが違うため、現在どのページなのかを判断するメソッドをつくりました。

app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
 before_action :request_path

 def request_path
    @path = controller_path + '#' + action_name
    def @path.is(*str)
        str.map{|s| self.include?(s)}.include?(true)
    end
  end
end

アプリケーションコントローラーにbefore_actionとして設定しているので、ページが遷移するたびにこのメソッドが発動されます。

コードの説明

ページ遷移する際のコントローラー名とアクション名を取得し、@pathに"コントローラー名#アクション名"という形で格納します。

次に引数を配列で取得し、その配列の中に@pathであるものがあるか確かめます。
配列の中にひとつでもtrueがあれば、tureを返しています。

メソッドの呼び出しは例えばこのような形です。

- unless @path.is('products#index')
    .breadcrumbs
      %ul
        %li

引数に「products#index」を渡しているので、productコントローラーのindexアクションの遷移先であるビューでなければ、breadcrumbsクラスが表示されるようになっています。

完成したパンくずリスト

- unless @path.is('products#index')
    .breadcrumbs
      %ul
        %li
          = link_to "○○", root_path
        - if @path.is('categories#index')
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last カテゴリー一覧
        - if @path.is('categories#show') && @category.indirect_ids.present?
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "カテゴリー一覧", categories_path, data: {"turbolinks": false}
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last #{@category.name}
        - if @path.is('categories#show') && @category.indirect_ids.empty? && @category.children.present?
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "カテゴリー一覧", categories_path
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "#{@category.parent.name}", category_path(@category.parent)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last #{@category.name}
        - if @path.is('categories#show') && @category.children.empty?
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "カテゴリー一覧", categories_path
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "#{@category.parent.parent.name}", category_path(@category.parent.parent)
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "#{@category.parent.name}", category_path(@category.parent)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last #{@category.name}
        - if @path.is('users#show')
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last マイページ
        - if @path.is('users#edit')
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "マイページ", user_path(@user)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last プロフィール
        - if @path.is('addresses#edit')
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "マイページ", user_path(@user)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last 住所変更
        - if @path.is('users#credit')
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "マイページ", user_path(@user)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last 支払い方法
        - if @path.is('users#logout')
          %li
            = icon 'fas', 'chevron-right'
          %li
            = link_to "マイページ", user_path(@user)
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last ログアウト
        - if @path.is('searches#index')
          %li
            = icon 'fas', 'chevron-right'
          %li
            %p.last
              = "#{@keyword}"

ページごとにリストを作っているので、やっぱりコードが長くなってしまいました。
また、categories#showが3つあったので、それぞれ条件を足しています。

まとめ

次回からはgemを使おうと思います。

ただ、「コントローラー#アクション」であるかを確かめるメソッドはどこかで役に立つときがきそうです。

参考
https://qiita.com/toduq/items/a9fa48926b060b2d8a5b

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

Ajax通信によってセレクトボックスを出現させる

概要

Ajax通信を利用し、あるアクションによってセレクトボックスを出現させます。

↓完成形
Image from Gyazo

困ったポイントは、選択するものによってselectタグのoptionの数が違うということです。

今回でいうと、
レディース トップス/パンツ の2つ
メンズ   トップス/パンツ/バッグ/靴 の4つ

条件によって、ビューに挿入する要素の長さを変えなければいけません。

完成コード

 まずは完成コードがこちらです。

category
$("#range").change(function(){
    $("#range-second").remove();
    $("#range-third").remove();
    var category = $('option:selected').val();

    function buildHTML(children){
      var option = ``
      children.forEach(function(child){
        option += `<option value="${child.id}">${child.name}</option>`
      });

      var html = `<select name="range-second" id="range-second">
                    <option value label=" "></option>
                    ${option}
                   </select>`

      return html;
    };

    $.ajax({
      url: '/users/1/products/new',
      type: "GET",
      data:{category: category},
      dataType: 'json'
      })
      .done(function(data){
        var html = buildHTML(data);
        $(".products_new_container__content__select__box__category").append(html);
      })
      .fail(function(){
        alert('error');
      })
  });

このなかで、今回のポイントとなるコードはこの部分です。

function buildHTML(children){
      var option = ``
      children.forEach(function(child){
        option += `<option value="${child.id}">${child.name}</option>`
      });

      var html = `<select name="range-second" id="range-second">
                    <option value label=" "></option>
                    ${option}
                   </select>`

      return html;
    };

一行目のbuildHTML関数の引数「children」には、selectタグの選択肢が配列として格納されています。

二行目で、まず空の変数optionを宣言します。

その次でforEachメソッドを使用し、childrenに含まれた要素の数だけ変数optionの中にoptionタグを追加していきます。

あとは、必要なだけのoptionタグの入った変数optionを、ビューに挿入する変数htmlのなかに入れるだけです。

まとめ

まず空の箱を用意して、配列の要素をeachでひたすら詰めていくというのは、Rubyでもよくやりました。

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

メソッド探索の意味がわからんって人へ

以下「メタプログラミングRuby」で勉強したことです。

メソッド探索

メソッド探索とは、その名の通り、呼ばれたメソッドを探すことである。

ruby.rb
class A
  def hoge
    puts "hoge"
  end 
end

class B < A; end

obj_b = B.new
obj_b.hoge #=> "hoge"

obj_bがhogeを呼んだ時rubyの中では何が起こっているのだろうか。
rubyは以下の2つのことを行う。

・メソッドを探す(メソッド探索)
・メソッドを実行する

ではメソッド探索をする時、rubyはどのように動いているのだろう。

※レシーバ : 呼び出したメソッドが属するオブジェクト。hogeで言うobj_b
rubyはレシーバの「クラス」に入り、目的のメソッドが見つかるまで継承チェーンを上っていく。

「ん?レシーバのクラスに入る?」
「レシーバ自体は探索しないの?」

そうなのだ。メソッド探索はレシーバのクラスから探索を始めるのだ。
ここにrubyの秘密がある。
実はオブジェクトのメソッドは全てクラスに属しており、オブジェクトはクラスが持っているメソッドを参照しているだけなのだ。
だからメソッド探索は「レシーバのクラス」から探索を始めるようになっている。

obj_b.hogeの話に戻ろう。
ではobj_b.hogeを呼んだ時、rubyはまず何処を探すだろう?

そう、obj_bのクラスであるBだ。
しかし、クラスBにはhogeメソッドが定義されていない。
では次に何処を探すだろう?

rubyは「目的のメソッドが見つかるまで継承チェーンを上っていく」ので、次に探すのはクラスAだ。
クラスAを探して、ついにhogeメソッドを見つけることができた。

以上がrubyのメソッド探索である。
ここで覚えておくべきことは

・rubyはレシーバのクラスに入り、目的のメソッドが見つかるまで継承チェーンを上っていく。
・メソッドは全てクラスが持っている。オブジェクトはクラスが持っているメソッドを参照しているに過ぎない。

以上の2つである。

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

Rubyで書いたSlack botのスクリプトをHerokuにアップして常時起動させる

はじめに

前回作成した、Amazonランキングを表示してくれるBotを、都度ターミナルからRubyを実行させるのではなく、常時起動させていきます。そのためにアプリをHerokuにアップロードしていくプロセスを説明していきます。

大まかな流れ

  • Heroku Toolbeltのインストール
  • Gemfileの作成
  • Procfileの作成
  • Herokuにアプリをアップロードする
  • Herokuにて常時スクリプトを実行させる

Heroku Toolbeltのインストール

下記のコマンドでインストール出来ます。

$ brew tap heroku/brew && brew install heroku

必要に応じてHerokuの公式記事も参考にしてください。

Gemfileの作成

通常、Ruby単体で開発する場合、Gemfileは不要です。しかし今回は、RubyアプリケーションをHerokuにコンパイルする際に必要な buildpack をインストールします。buildpackインストール時に、Gemfileを参照した上で必要なファイルをインストールするため、Gemfileの作成は必須です。

# Gemfile
source 'https://rubygems.org'
ruby '2.6.3'

当初Ruby2.3.0で開発をしていたのですが、Herokuにデプロイする際、Rubyのバージョンがサポート外であったため、エラーが起きたので、こちらの記事を参考に、Rubyは最新版にアップデートさせました。

Procfileの作成

また、今回はWorker Dynoにてバックグラウンド処理を回すので、フォルダ内にProcfileを作成し、Worker Dynoで行う処理を下記のように宣言します。

worker: bundle exec ruby ruby_bot.rb

Herokuにアプリをアップロードする

続いてHerokuにデータをアップロードします。

下記のコマンドを順番に叩きます。

$ git init
$ git commit -m "init commit"
$ heroku create
$ heroku buildpacks:set heroku/ruby -a (アプリ名)
$ git push heroku master

4つ目のコマンドにて、rubyのbuildpackをインストールします。(アプリ名)の部分は、$heroku create で作成された、アプリ名を入れます。

GitとHerokuを連携させる

Herokuでアプリが立ち上がった所で、GitとHerokuを連携させると便利です。

スクリーンショット 2019-05-12 10.22.06.png

上記のように、繋込みをすると、GitのMasterにPushした内容が、Herokuに自動で反映されます。

Herokuにて常時スクリプトを実行させる

最後に、今回の作成したSlack Botを常時起動させておくために、Worker Dynoを起動させる必要があります。先程Procfileで宣言していたため、ResourceタブにWorkerが表示されているので、こちらをONにして、Confirmします。

スクリーンショット 2019-05-12 11.02.51.png

最後に

ターミナルからRubyファイルを実行させなければ、オフラインであったBotが、今回の作業を経て常時オンラインに変わりました!

スクリーンショット 2019-05-12 15.46.10.png

Procfileの記載に誤りがあったり、Gemfileの頭文字が小文字になっているという初歩的なミスをしてしまい、buildpackが正常にインストール出来ずに時間を溶かしてしまいました。今後はApp化も進めていければと思っております。

参考記事

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

特異メソッドの意味がわからんって人へ

以下「メタプログラミングRuby」で勉強したことです。

特異メソッドとは

特定のオブジェクトに対して定義されたメソッドのこと。

qiita.rb
wareki = "heisei"

def wareki.is_reiwa?
  self == "reiwa"
end

wareki.is_reiwa? #=>false

ここで定義したwareki.is_reiwa?はStringクラスの他のオブジェクトに影響を及ぼすことはない。warekiというオブジェクト(正確には"heisei")に対してのみ適用されるメソッドである。
特異とは普通と異なり特別なことだ。特異メソッドはその言葉通り、普通のメソッドとは異なり、特別に定義されたメソッドのことだ。
(英語ではsingular methodと呼称されている。singularには「個別の」という意味があるので、「個別に定義されたメソッド」と理解する方がしっくり来るかもしれない)

クラスメソッドと特異メソッドの関係

qiita.rb
class Hoge
  def self.class_method_a
    puts "class_method_a"
  end
end

Hoge.class_method_a #=> "class_method_a"

rubyを少しでも触ったことのある人なら、上のコードが何をやっているかわかるだろう。
Hogeクラスにclass_method_aクラスメソッドを定義している。
これを先の特異メソッドと見比べてみてほしい。

「なんか似てない?」

実はクラスメソッドも一種の特異メソッドなのだ。

「え?でも特異メソッドってオブジェクトに対して定義するものじゃないの?」
「クラスってオブジェクトじゃなくね?」

と思うかもしれないが、実はクラスもオブジェクトだ(ややこしい)。
もっとややこしい言い方をすると「HogeクラスはClassクラスのオブジェクト」だ。

クラスメソッド = Hogeクラス(Classクラスの「オブジェクト」)に定義されたメソッド
特異メソッド = 特定のオブジェクトに対して定義されたメソッド
クラスメソッド == 特異メソッド

以上のことからクラスメソッドも特異メソッドの一種なのだ。

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

【Ruby基礎】アルファベットの名前からイニシャルを作る【メソッド:split,map,join,upcase】

codewarsの問題を解いていて、できなかったので、自分で整理。
問題はこちら→(8kyu)Abbreviate a Two Word Name

Write a function to convert a name into initials. This kata strictly takes two words with one space in between them.
The output should be two capital letters with a dot seperating them.
It should look like this:
Sam Harris => S.H
Patrick Feeney => P.F

まずは解答例

解答例は、以下のとおりです。

def abbrev_name(name)
  name.split.map { |s| s[0]}.join('.').upcase
end

では、順をおって解説していきます。

必要なメソッドは4つ

このために必要なメソッドは以下の4つです。

1 splitメソッド(【Ruby入門】splitで文字列を分割しよう!)

splitメソッドは引数を区切り文字として文字列を分割して配列として返すメソッド。
引数を指定しない場合は、空白文字で区切られる。
空白文字として扱われるのは、” “(半角スペース)、”\n”(改行コード)、”\t”(タブ)など。

(例)
区切り文字指定しない場合
str = "I like eating"

array = str.split

p array
→["I", "like", "eating"]


区切り文字指定する場合
str = "I,like,eating"

array = str.split(",")

p array
→["I", "like", "eating"]

区切り文字は任意の文字で分割することもできる
str = "123456"

array = str.split("34")

p array
→["12", "56"]

上記は一部の例で、ほかにもいろいろな使用法があるので、気になる方は引用サイトをご覧ください。

2 mapメソッド(Ruby mapメソッドについて)

配列の要素の数だけ繰り返し処理を行うメソッド。

書き方は
配列の入った変数.map {|変数名| 処理内容 }
です。

(例)
a1 = [100, 200, 300]
a2 = a1.map { |x| x * 3 }
p a2 # [300, 600, 900]

各要素にメソッドを適用するときは、以下のように省略して書くことができる
オブジェクト.map(&:メソッド名)

a = ["HOGE", "FUGA"]
p a.map(&:downcase) # ["hoge", "fuga"]

mapは処理後に戻り値で配列を作成してくれ,元の配列が上書きされることはありません。

3 joinメソッド(Rubyリファレンス:join (Array))

array.join(sep = $,)
joinメソッドは、配列の各要素を文字列に変換し、引数sepを区切り文字として結合した文字列を返します。

arr = ["hello", "world", 123]
puts arr.join(", ")
→hello, world, 123

puts arr.join
→helloworld123

4 upcaseメソッドRuby 2.6.0 リファレンスマニュアル > ライブラリ一覧 > 組み込みライブラリ > Stringクラス > upcase

全ての小文字を対応する大文字に置き換えた文字列を返します。
※大文字を小文字にしたいときは、downcaseメソッドを使用すればいいです。

(例)
p "stRIng? STring.".upcase   # => "STRING? STRING."

コードを書く考え方

今回は、最初に与えられるnameが文字列なので、まずはsplitメソッドで分割して、配列にします。

name = "taro tanaka"

この段階でこうなる
name.split
→["taro","tanaka"]

次にmapメソッドで配列の一番最初の文字だけ引き出す
name.split.map{|s| s[0]}
→["t","t"]


joinメソッドで配列の各要素を'.'で区切り、文字列に変換
name.split.map{|s| s[0]}.join('.')
→t.t


最後に、大文字にするためupcaseメソッドを追加
name.split.map{|s| s[0]}.join('.').upcase
→T.T

またほかにも多くの回答例があり、参考になります。

今日学んだこと

  • splitメソッドは、文字列を分割し、配列にする。
  • mapメソッドは配列に対して、同じ処理を繰り返し行う。
  • joinメソッドは、配列の要素を文字列に変換し、引数を区切り文字として、結合した文字列を返す。
  • upcaseメソッドは、小文字を大文字に変更する。

以上で、今日のコード基礎勉強でした。
今回は、メソッドの基本的な使用法を使った回答法でしたが、ほかにもメソッドは応用的な使い方があるようです。
次回以降でさらに深ぼりしていこうと思います。

間違いがありましたら、お手数ですがご教示ください。

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

Rails チュートリアル 第11章 学習内容のメモ

第11章アカウントの有効化

  • 本章ではユーザの新規登録時に、該当のユーザが本当にそのメールアドレスの持ち主であることを確認する機能を追加する

Activationトークンのコールバック

  • 6章で実装したbefore_saveコールバックではオブジェクトが保存される直前、オブジェクトの作成時や更新時にそのコールバックが呼び出される
  • 今回はオブジェクトの作成時のみにコールバックを呼び出したいので、before_createコールバックを使用する
  • 以下のように実装する。
app/models/user.rb
class User < ApplicationRecord
  attr_accessor :remember_token, :activation_token
  before_create :create_activation_digest
  validates :name,  presence: true, length: { maximum: 50 }
  .
  .
  .
  private

    # 有効化トークンとダイジェストを作成および代入する
    def create_activation_digest
      self.activation_token  = User.new_token
      self.activation_digest = User.digest(activation_token)
    end
end

アカウント有効化のメール送信

  • 有効化メールを送信するための、メイラーを作成する
  • メイラーの構成は、コントローラーのアクションとよく似ており、メールのテンプレートをビューと同じように定義できる
  • メイラーはrails generateで生成できる

本番環境でのメール送信

  • テストはパスしていたが、ユーザ登録の際に送付されたURLをクリックした際に以下のページが表示された

image.png

  • 本番環境の設定を誤っていた
  • 以下の'<your heroku app>.herokuapp.com'の箇所を自身のherokuアプリのURLに変更することで解決
config/environments/production.rb
Rails.application.configure do
  .
  .
  .
  config.action_mailer.raise_delivery_errors = true
  config.action_mailer.delivery_method = :smtp
  host = '<your heroku app>.herokuapp.com'
  config.action_mailer.default_url_options = { host: host }
  ActionMailer::Base.smtp_settings = {
    :address        => 'smtp.sendgrid.net',
    :port           => '587',
    :authentication => :plain,
    :user_name      => ENV['SENDGRID_USERNAME'],
    :password       => ENV['SENDGRID_PASSWORD'],
    :domain         => 'heroku.com',
    :enable_starttls_auto => true
  }
  .
  .
  .
end

メモ

- rails serverを立ち上げようとすると、以下のように表示され起動できなくなった

$ rails s
=> Booting WEBrick
=> Rails 3.2.14 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
A server is already running. Check /worktest/sample/tmp/pids/server.pid.
Exiting
  • バックグラウンドでrails serverが立ち上がっていることが原因
  • $ ps aux | grep pumaでrails serverプロセスを検索し、
  • kill -9 ”プロセスID”でプロセスを停止しようとするができない
  • -bash: kill: (37580) - No such processと表示される
  • プロセスIDが自動で切り替わるバグが発生している??
  • 以下のURLを参考にして対処した

Rails sのプロセスが切れない時

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

rubyで数字比較ゲームを作った

おはようございます。

今日は数字比較ゲームを作ってみました。

仕様
一桁目が1~20の数字と二桁目が1~10の数字の2つの数字を持ったカードが複数枚ある。
一枚目を親としそれ以降を子とし、それぞれを比較していく。
一桁目が小さい方を勝ちとする。
一桁目が同じだったら二桁目を比較する。
二桁目は大きい方を勝ちとする。
子が何回勝ったかを返す

a = <<~TEXT
12  8 #親
15  9 #子
 4 11 #子
12 19 #子
12  4 #子
TEXT

=> 2

コード

FORMAT = /(\d*) (\d*)/

def high_low_check(card_number)
  card = card_number.scan(FORMAT).map { |array| array.map(&:to_i) }
  card[1..-1].map { |array|
    if array[0] < card[0][0]
      'win'
    elsif array[0] == card[0][0]
      'win' if array[1] > card[0][1]
    end
  }.count('win')
end

正規表現で各カードを配列に入れて比較していきます。
if文の中が似たような比較があってあまりDRYじゃないな〜という印象ですがどう治せばいいか分からなかったので、
もし分かる方いたら教えて頂きたいです?

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

Ruby初心者が勉強会に参加してみた(全7回)第1回

(noteにまとめたものをこちらにも。)

スクールに行ったこともなければ、

今まで独学(今年1月〜)で勉強していたので

緊張とドキドキが混じりつつ、

株式会社X-HACK主催の

【全7回】Ruby / Vue.js「ゼロから」ウェブサービスを作る【初心者向け | 個別指導あり】に

題名通り、今年1月からRubyの勉強をし始めた初心者が勉強会に参加してきました。

・Rubyのバージョンを指定する

rbenvでRubyのバージョンを2.4.1に統一。

rbenvについては書籍読んだりする中で出てくるし

実際ポートフォリオ作成の時に、

なんとなくで使っていたけど、

rbenvとはrubyのバージョンを管理する仕組みで、

一つのマシンで好きにバージョンを入れて切り替えることができるもの。

と、改めて認識出来ました!

変更に当たっては、以下のURLの元変更しました。

https://qiita.com/_am_/items/c1dbeb11f40bbbac8fd9

・パスの概念

パスはファイルやフォルダの場所を示した文字列のことで、

どの階層からでも呼び出せるようにしたい!というのがパスの概念というか目的。

$ echo $PATH

・シェルコマンド

ここは講義内容とは別で補足でお話していただいた内容で、

便利なのでは!?と個人的に気になりました。

というのも、git.shの中に、

gitコマンドをまとめて入れれば

$ sh git.sh
で実行するだけで良いというもの。

・二進数

コンピュータは0と1での処理しか出来ない。

プログラミングとは

一言で言えば2進数でできるデータ処理。

データをコンピュータにどうやって処理させるかというのを
プログラミングで指示しているということ。

ここは凄く勉強になりましたし、

色紙を使ったワークショップが楽しかったです。

(内容としては、0と1だけを使ってどのように相手に色とその配置を伝えるかというもの)

=========

全て細かく書いてしまうとかなり長くなるので、

この辺にして

他にも色々勉強になるお話をしていただいたり、

実際の現場内での経験上のお話などなど・・

正直時間が経つのもあっという間でした。

全7回を通してどれだけ成長できるかは、

自分次第だと思うので

この環境に甘んじず、自分でも引き続き勉強していきたいと思います。

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

ポートフォリオ『CodeZine』使用解説

CodeZine

これまでに読んだ技術本を

・ タイトル ・ おすすめポイント ・ 画像

の3点で簡潔にまとめてユーザー間でシェアするアプリです。

使い方の説明

・テストユーザーでログイン

・記事を投稿するために「新規登録」ボタンをクリック

→新規記事投稿ページの入力フォームに、

おすすめの読んだ本のタイトル、おすすめポイント、画像の3点を書き込む。

・投稿者一覧ページに新規記事が追加される。

ezgif.com-video-to-gif.gif

・記事を編集・削除するには

→記事一覧ページの編集ボタンをクリック

ezgif.com-video-to-gif (1).gif

・記事の検索するには
→名称もしくは登録日時を入力し検索ボタンをクリック。
ezgif.com-video-to-gif (2).gif

主な機能

■ユーザー管理機能

・新規ユーザー登録機能

・ユーザー詳細表示機能

・ユーザー一覧表示機能

・ユーザーアカウント編集・削除機能

・ユーザーログイン、ログアウト機能

■投稿記事管理機能

・新規記事投稿機能

・記事詳細表示機能

・記事への画像アップロード機能

・記事編集・削除機能

・記事一覧表示機能

・記事検索機能

■ユーザー・記事・検索結果一覧のページネーション機能

使用技術

・開発環境

ローカル for Mac

・テスト環境

RSpec(システムテスト、結合テスト・機能テスト)

・本番環境

Heroku

・DB

Postgresql

・フロント開発

Bootstrap

Slim

・画像アップロード機能

Active Storange

・ページネーション機能

kaminari

・検索機能

ransack

・CSV形式のファイルのインポート、エクスポート

・Ajax

投稿記事削除

依存関係

Rails: 5.2.3

Ruby: 2.5.1

Bootstrap: 4.3.1

RSpec 3.8

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

ポートフォリオ『CodeJin_BOOK123』使用解説

*アプリ名が登録商法に引っかかる可能性があるようなので変更しました。
 ご指摘ありがとうございます!
 

Codejin_BOOK123

これまでに読んだ技術本を

・ タイトル ・ おすすめポイント ・ 画像

の3点で簡潔にまとめてユーザー間でシェアするアプリです。

使い方の説明

・テストユーザーでログイン

・記事を投稿するために「新規登録」ボタンをクリック

→新規記事投稿ページの入力フォームに、

おすすめの読んだ本のタイトル、おすすめポイント、画像の3点を書き込む。

・投稿者一覧ページに新規記事が追加される。

ezgif.com-video-to-gif (3).gif

・記事を編集・削除するには

→記事一覧ページの編集ボタンをクリック

ezgif.com-video-to-gif (4).gif

・記事の検索するには
→名称もしくは登録日時を入力し検索ボタンをクリック。

ezgif.com-video-to-gif (5).gif

主な機能

■ユーザー管理機能

・新規ユーザー登録機能

・ユーザー詳細表示機能

・ユーザー一覧表示機能

・ユーザーアカウント編集・削除機能

・ユーザーログイン、ログアウト機能

■投稿記事管理機能

・新規記事投稿機能

・記事詳細表示機能

・記事への画像アップロード機能

・記事編集・削除機能

・記事一覧表示機能

・記事検索機能

■ユーザー・記事・検索結果一覧のページネーション機能

使用技術

・開発環境

ローカル for Mac

・テスト環境

RSpec(システムテスト、結合テスト・機能テスト)

・本番環境

Heroku

・DB

Postgresql

・フロント開発

Bootstrap

Slim

・画像アップロード機能

Active Storange

・ページネーション機能

kaminari

・検索機能

ransack

・CSV形式のファイルのインポート、エクスポート

・Ajax

投稿記事削除

依存関係

Rails: 5.2.3

Ruby: 2.5.1

Bootstrap: 4.3.1

RSpec 3.8

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

<a href="https://web.facebook.com/GiroDitalia2019Live24/">SSSSSSSSSSSSSSS</a>

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