20200226のRubyに関する記事は18件です。

Ruby/GTK3 - SpinButton

gem install gtk3

SpinButton

Gtk.SpinButtonでは2つの矢印のいずれかをクリックして、表示されている値を増減する。直接値を入力することもできる。

image.png

require 'gtk3'

class SpinButtonWindow < Gtk::Window

  attr_accessor :spinbutton

  def initialize
    super
    set_title "SpinButton Demo"
    set_border_width 10

    hbox = Gtk::Box.new(:horizontal, 10)
    add hbox

    adjustment = Gtk::Adjustment.new(0, 0, 100, 1, 10, 0)
    @spinbutton = Gtk::SpinButton.new(adjustment)
    hbox.pack_start(spinbutton)

    check_numeric = Gtk::CheckButton.new("Numeric")
    check_numeric.signal_connect("toggled"){|b| on_numeric_toggled b}
    hbox.pack_start(check_numeric)

    check_ifvalid = Gtk::CheckButton.new("If Valid")
    check_ifvalid.signal_connect("toggled"){|b| on_ifvalid_toggled b}
    hbox.pack_start(check_ifvalid)
  end

  def on_numeric_toggled(button)
    spinbutton.set_numeric(button.active?)
  end

  def on_ifvalid_toggled(button)
    policy = if button.active?
               Gtk::SpinButtonUpdatePolicy::IF_VALID
             else
               Gtk::SpinButtonUpdatePolicy::ALWAYS
             end
    spinbutton.set_update_policy(policy)

  end
end

win = SpinButtonWindow.new
win.signal_connect("destroy"){ Gtk.main_quit }
win.show_all
Gtk.main
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

呼び出す側?呼び出される側?ポリモーフィズムがやっとわかった?

はじめに

オブジェクト指向を学ぶ際に薦められた本「オブジェクト指向でなぜつくるのか」を読んでいる際に、「ポリモーフィズム」への理解に時間がかかったのでまとめておこうと思います。実際にこの本を読んでみてオブジェクト指向に対するもやもやがすっきりしました。おすすめですのでぜひ読んでみてください!

注意

この記事はポリモーフィズム自体は解説はしません。ポリモーフィズムを解説している良い記事は他にあると思いますので、そちらをご覧ください。この記事はポリモーフィズムに関する「呼び出す側と呼び出される側」の僕がつかんだイメージを書き残したものです。間違いがあるかもしれないので、もしあったらコメントしていただけるとありがたいです!

ポリモーフィズム?

「オブジェクト指向でなぜつくるのか」によれば、

ポリモーフィズムはサブルーチンを呼び出す側のロジックを一本化する仕組み、すなわち「共通メインルーチン」を作るしくみである。

ん?となると思いますが、もちろん実際にこの本の流れに沿って読めば理解できます。
サブルーチンは「プロシージャ、関数、副手続き」などさまざまな呼び名がありますが、僕は「関数」のイメージでとらえています。
さらに、本の中では共通メインルーチンの説明を共通サブルーチンと対比させて、
共通サブルーチン:

呼び出す側が増えても、呼び出される側を修正する必要がない

共通メインルーチン(ポリモーフィズム):

呼び出される側が増えても、呼び出す側を修正する必要がない

とてもわかりやすいと思うのですが、僕にはこの「呼び出す側、呼び出される側」のイメージがうまくできませんでした。
そこでコードに書き起こしてみたところイメージができるようになりました。以下のコードはあくまでイメージだと思ってください!ちなみに僕はRubyを勉強しているのでRubyで考えました!

イメージ

共通サブルーチン

呼び出される側(のコード)

def cry
  #「なく」処理
end

呼び出す側(のコード)(こんな書き方はできない)

# メソッドの呼び出し
# ある処理Aの中
cry # なく

# ある処理Bの中
cry # なく

# ある処理C, D, E...と「呼び出す側」は増えるが、
#「呼び出される側」のロジック(処理、中身)は変わらない

共通メインルーチン

呼び出される側(のコード)

class Animal
  def cry
    #「なく」処理
  end
end

class Human < Animal
  def cry
    'オギャー'
  end
end

class Crow < Animal
  def cry
    'カー'
  end
end

呼び出す側(のコード)

# メソッドの呼び出し
Human.cry => 'オギャー'
Crow.cry => 'カー'

# 他にもDog, Cat...と「呼び出される側」は増えるが、
# メソッドを「呼び出す側」のロジック(形式、見た目)は変わらない

以上で、イメージの説明は終わりです。「呼び出す側」のロジックが一本化されているため、定義されているメソッドは、「呼び出される側」が何(のクラス)であるかを気にせず(内部で自動で判断して)使うことができます。

以上で、ポリモーフィズムの「呼び出す側」「呼び出される側」のイメージの説明が終わりです。
たぶん多くの人がポリモーフィズムに関してすんなり理解できたと思うのですが、僕は変な部分でつまづいてしまいました。誰かの参考になると嬉しいです!間違いがあったらご指摘ください!

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

bundle install時にsaasに関するエラーが発生した

発生したエラー

RUNTEQのRuby on Railsの技術試験を受験し、環境構築をしている際に以下のエラーが発生しました。

ターミナルで以下のコマンドを入力

ターミナル
bundle install --path=vendor/bundle

すると最後の段階で以下のエラーが発生

ターミナル
Ruby Sass has reached end-of-life and should no longer be used.

* If you use Sass as a command-line tool, we recommend using Dart Sass, the new
  primary implementation: https://sass-lang.com/install

* If you use Sass as a plug-in for a Ruby web framework, we recommend using the
  sassc gem: https://github.com/sass/sassc-ruby#readme

* For more details, please refer to the Sass blog:
  https://sass-lang.com/blog/posts/7828841

何やら使用しているものに関する注意書きのようです。
googleで翻訳をしてみると

エラーを解読

ターミナル
Ruby Sassはサポートが終了したため、使用しないでください。

* Sassをコマンドラインツールとして使用する場合、新しいDart Sassの使用をお勧めします
  主な実装:https://sass-lang.com/install

* SassをRuby Webフレームワークのプラグインとして使用する場合は、
  sassc gem:https://github.com/sass/sassc-ruby#readme

*詳細については、Sassブログを参照してください。
  https://sass-lang.com/blog/posts/7828841

とのこと、私はコマンドラインツールは別のものを使用しているため、今回は2番目のRaisでsassを使用する際に発生した注意みたいですね、記述通りにgithubに飛びREADMEを確認すると対応が書いてありました。

解決策

Gemfile
gem 'sassc'

こちらを記述すれば良いみたいです。
その後bundle installすると、無事完了しました。

原因

・sassって?
後日記載します

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

Ruby/GTK3 - LinkButton

gem install gtk3

LinkButton

ウェブブラウザで使用されるハイパーリンクのようなボタン。
image.png
クリックするとQiitaが開く。

require 'gtk3'

class LinkButtonWindow < Gtk::Window
  def initialize
    super
    set_title 'LinkButton Demo'
    set_border_width 10

    button = Gtk::LinkButton.new('http://qiita.com', 'Visit Qiita')
    add button
  end
end

win = LinkButtonWindow.new
win.signal_connect('destroy') { Gtk.main_quit }
win.show_all
Gtk.main

Python版

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

bundle install時にMySQLのエラーが発生

bundle install時にMySQLのエラーが発生

RUNTEQのRuby on Railsの技術試験を受験し、環境構築をしていた際に以下のエラーが発生しました。

入力したコマンド

ターミナル
bundle install --path=vendor/bundle

発生したエラー

ターミナル
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    current directory: /Users/atsukikomuro/projects/133_atsuki1224_runteq_selection_rails_basic/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/ext/mysql2
/Users/atsukikomuro/.rbenv/versions/2.6.4/bin/ruby -I /Users/atsukikomuro/.rbenv/versions/2.6.4/lib/ruby/2.6.0 -r ./siteconf20200226-71382-91nqge.rb extconf.rb
checking for rb_absint_size()... yes
checking for rb_absint_singlebit_p()... yes
checking for rb_wait_for_single_fd()... yes
-----
Using mysql_config at /usr/local/opt/mysql@5.6/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for SSL_MODE_DISABLED in mysql.h... no
checking for MYSQL_OPT_SSL_ENFORCE in mysql.h... no
checking for MYSQL.net.vio in mysql.h... yes
checking for MYSQL.net.pvio in mysql.h... no
checking for MYSQL_ENABLE_CLEARTEXT_PLUGIN in mysql.h... yes
checking for SERVER_QUERY_NO_GOOD_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_NO_INDEX_USED in mysql.h... yes
checking for SERVER_QUERY_WAS_SLOW in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_ON in mysql.h... yes
checking for MYSQL_OPTION_MULTI_STATEMENTS_OFF in mysql.h... yes
checking for my_bool in mysql.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/opt/mysql@5.6/lib
-----
creating Makefile

current directory: /Users/atsukikomuro/projects/133_atsuki1224_runteq_selection_rails_basic/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/ext/mysql2
make "DESTDIR=" clean

current directory: /Users/atsukikomuro/projects/133_atsuki1224_runteq_selection_rails_basic/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2/ext/mysql2
make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
compiling statement.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /Users/atsukikomuro/projects/133_atsuki1224_runteq_selection_rails_basic/vendor/bundle/ruby/2.6.0/gems/mysql2-0.5.2 for inspection.
Results logged to /Users/atsukikomuro/projects/133_atsuki1224_runteq_selection_rails_basic/vendor/bundle/ruby/2.6.0/extensions/x86_64-darwin-18/2.6.0/mysql2-0.5.2/gem_make.out

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.

In Gemfile:
  mysql2

解決策

以下のコマンドを入力後にbundle installを行うことで正常に終了しました。

ターミナル
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"

原因

後日記入します。

参考文献

RailsプロジェクトでMySQLがbundle installできなかった
bundle installでmysql2がエラーになる件

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

【Rails Devise】ログインユーザーのみ、内容を見れるようにするには

ログインユーザーのみ、内容を見れるようにするには

Devise使用時に、ヘッダーやログアウトボタンなどの内容をログインユーザーのみに表示させたい場合などに、
ご参考にして頂ければと思います!

めちゃめちゃ簡単です!

html.erb
<% if user_signed_in? %>
   <%# この間に書かれた内容はログインユーザーのみ見れる %>
<% else %>
   <%# この間に書かれた内容はログインしていないユーザーのみ見れる %>
<% end %>

こんな使い方!

html.erb
<% if user_signed_in? %>
   <li><%= link_to 'LOGOUT', destroy_user_session_path, method: :delete %></li>
<% else %>
   <%= link_to "ログイン", new_user_session_path, class: 'post' %>
   <%= link_to "新規登録", new_user_registration_path, class: 'post' %>
<% end %>

これでログインユーザーだけがログアウトできて、ログインしていないユーザーだけが新規登録やログインができます!

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

画像一覧表示で指定の枠内でスクロールさせる方法

現在スクールにてプログラミングを学習中
目標は4週間の間でフリマアプリを完成させる

開発環境
rails 5.2.4.1
ruby 2.5.1

初学者向けに記述してます
アウトプット練習の為でもあります。

実装したいこと
画像を指定の範囲内でスクロールさせる。

完成イメージ
https://i.gyazo.com/55340c88a724b2e46eee6ed3254fbef6.mp4
写真は動物ですがあくまでテストイメージです。
予めご了承ください。

実装にあたりhamlの記述は終えているものとします。
書きにはSCSSの記述のみ載せます。

まずはスクロールさせたいブロックの枠のクラスに下記を記述(?部分)

&__lists {
  width: 800px;
  padding: 26px 0;
  margin: 0 auto;
  display: flex;
?overflow-x: scroll;

次にスクロースさせたい子要素の.scssに記述を追記

.item_list {
?min-width: 250px;
  height: 245px;
  color: #000000;
  background-color: #ffffff;
  display: inline-block;
  position: relative;
  margin: 0 10px;

widthにmin-を追加する記述で最低の枠の大きさを固定でき
指定した大きさの枠内でクスロールしてくれる。

これでスクロール完了です。

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

Docker Compose でホストとクライアントの両方にて Rails を起動したいそこのあなた!

なにこれ?

あんまりいないとは思うけど、Rails で Docker Compose を使用しているときにホスト側とクライアント側で Rails server を起動したいときはありませんか?自分の場合だと、System Test がどうしても Docker 環境のみで動作させる方法が見つけ出せなかったので、自分の場合 Rails を Ubuntu 環境でシステムテストを走らせて、それ以外は Docker 内のコンテナで動作させたいと思ったのでこういう環境が必要になった。そんなことをしようとしていると困るのが、(Rails のルート)/tmp/ に作られるファイルがホスト側とクライアント側で競合して、同時に起動できないという問題だった。そんなときに読んで解決できる糸口となったのが「DockerでVolumeをマウントするとき一部を除外する方法」だったので、自分もココにその軌跡をのこしておくことにする。

なにするの?

要は Rails 同時に起動できない原因は tmp フォルダが存在するからである。こいつさえなければ、ポートの競合とかはともかく、起動できるのだ。要はお互いが疎な関係になればいい。つまり、クライアントとホストの tmp フォルダが同期しなければいい。以下のコードは tmp フォルダだけはホストと動悸しないようにしてある。

version: '3'

volumes:
  rails_tmp_data:

services:
  as:
    build:
      context: ./
    ports:
      - 3333:3000
    volumes:
      - ./:/usr/src/app/
      - rails_tmp_data:/usr/src/app/tmp/
    command: 
      /bin/sh -c "yarn install --check-files && bundle install && rails db:create && rails db:migrate && rm -f /usr/src/app/tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0' --early-hints"

なお上記のコードは、要点だけに絞っている。そのため、コピペでは動かないのは、予めご了承いただきたい。

これでおしまい

ポートの設定を端折ってしまった。そこらへんは、ココでは記事にしない。途中で記事を書くのがめんどくさくなったからね。ググるかなにかしてください。そんじゃねー。

タイトルについて

スタパ斉藤マジリスペクト、というわけでなく、冗談抜きでこんなタイトルしか思いつかなかった。

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

【未経験転職】【① 3-4月編】2020年3月末でプログラマー目指して退職する31歳公務員がロードマップを立ててみた!

はじめに

みけた@プログラマー転職、公務員31歳です!

仕事をしていく中で「これじゃない感」が募っていく中、
無謀にもプログラマー転職を目指して、退職願を提出してしまいました!!!

とりあえず、5月からはプログラミングスクール「Dive into Code」さんに
お世話になる方向で検討中です。

が、しかし!
それまでの繋ぎの期間にスタートダッシュを切る必要があるということで、
そのロードマップを作成してみました。

プログラマー転職に向けてのロードマップ(3〜4月)

○ 学習計画

エクセルを使って、まとめてみました。
プログラミング学習スケジュール_page-0001.jpg
プログラミング学習スケジュール_page-0002.jpg

○ 学習時間

スケジュールを確認し、プログラミングのための学習時間を以下のように設定しました。
就業中であるため、3月の学習時間は甘めに見積もりました。

【勉強時間】
  3月  30時間
  4月 170時間

【Progate】
  HTML/CSS  20時間
  Javascript  22時間
  jQuery    12時間
  Ruby     7時間
  Ruby on Rails 65時間
  合計     126時間

 ※ 基本的にprogateは2周する予定です。
   Rubyについては既にやったことがあるので、1周のみの予定。
 ※ 所要学習時間については、progateに記載の修了時間を参考にしました。

【Railsチュートリアル】
  全14章を2周する 74時間
 (ただし、1周目は演習をせず、コードもコピペで済ます)

 ※ Railsチュートリアルの学習時間についてはQiitaのこちらの記事を参照しました。
   ただ、他のみなさんの反応を見ると、結構時間がかかっているようです。
  【Qiita】Railsチュートリアルの各章にかかった時間

○ 学習内容について

何を学習するかについては下記を参考にしました。

【Qiita】未経験からRuby on Railsを学んで仕事につなげるまでの1000時間メニュー
【Qiita】化学系研究者が完全未経験からWeb系自社開発企業に転職するまで
【プログラミングスクール】「Dive into Code」が事前学習として推奨している内容

なお、集中的に学んだ方が効率的であると感じていたため、
 ① ProgateでRailsのコースを終えた後
 ② 直ちにRailsチュートリアルへと移行する
以上のようなスケジュールで学習することとしました。

自社開発スクールへの就職実績に定評のあるポテパンキャンプでは、

キャリアコースの応募条件
「Railsチュートリアルと他Web開発の基礎を学習済み」であること
 参照元:POTEPAN CAMP コースについて

となっているので、Railsチュートリアルはいずれにしても避けて通れないのかなと。

とはいえ、
【Qiita】未経験からRuby on Railsを学んで仕事につなげるまでの1000時間メニュー
では、Bootstrapを使ったWebページ作成やSinatraを使ったWebアプリケーション作成を推奨しているようなので、モチベーションが上がらなくなれば、方向転換も検討していきます。

○ Qiitaへの技術記事投稿

とりあえず、Progateをやっていく中で疑問点等が出てきたら、Qiitaにまとめていきます。
また、Railsチュートリアルのノートも公開していく予定です。

転職にあたっても、これがアピールになるらしいです。
(動機は極めて不純です)

○ 100DaysOfCode

流行っている(いた?)らしいです!
本格的に学習を開始する、4月からツイッターで発信していきます。

また、3月も勉強をしたタイミングで適宜情報発信していきます。
ツイッターアカウントはこちら

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

image画像を一覧表示させる

画像の一覧表示の実装について実装

現在、プログラミングスクールにてフリマアプリを5名で実装中
少し手間取ったホーム画面の一覧表示の実装手順を載せます。
フロント実装は完了済みとします。

開発環境
rails 5.2.4.1
ruby 2.5.1

マークアップはhamlで行いました。

※アウトプットの為記述
※初学者向けに記述します

完成イメージ

home-index.png

※載せている写真は動物ですがあくまでテスト画像として載せているだけです。
 予めご了承ください。

まずはコントローラの記述から
今回は一覧の表示をしたいので対象のapp/controllers/home_controller.rbを編集

home_controller.rb

 class HomeController < ApplicationController
   def index
     @images = Image.all
     @items = Item.all
   end
 end

今回はフリマのitemテーブルとimageテーブルのデータを取得できるように一旦記述
これでアイテムテーブルとimegeテーブルのデータをホーム画面に持ってきます。
roteはすでにできている為、今回は追記はありませんでしたが、一応載せております

routes.rb

 Rails.application.routes.draw do
   devise_for :users
   root "home#index"
   resources :items, only: [:new, :create, :show, :edit, :destroy]
   resources :sendings, only: [:new, :create]
   resources :users, only: [:edit]
   resources :cards, only: [:new, :create, :index, :destroy]
   resources :orders, only: [:index, :new, :create] do  
     collection do
       get 'index', to: 'orders#index'
       post 'pay', to: 'orders#pay'
       get 'done', to: 'orders#done'
     end
   end
 end

次にhamlに追記


  .main__item__category
    %h2.main__item__category__title
      ピックアップカテゴリー
    .main__item__category__item_box
      = link_to "#", class: "main__item__category__item_box__title" do
        新規投稿商品
      %ul.main__item__brand__item_box__lists
        %li
       ?- @items.each do |item| 
       ?  = link_to item_path(id: item.id) ,class: 
"main__item__brand__item_box__lists--list, item_list" do
            - ft_image = item.images.first
            = image_tag ft_image.photo.url, class: 
"item_list__picture"
            .item_list__body
              %h3.item_list__body__name
                = item.name
              %ul
                %li.item_list__body__price 
                  = item.price 
                  = "円"
                %li.item_list__body__likes
                  = icon 'fas', 'star'
                  0
              %p (税込)     

今回はitemテーブルに紐づいているimageの最初のデータを取得したかった為、上記の?のように追記いたしました。
この記述でデータを取得し表示まではできました。
あとはスクロールで画像がうまくスクロールするようにいたしました。
長くなりますのでスクロールは別の記事に載せたいと思います。

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

【やってみた】未経験エンジニアのPay.jp導入(Ruby on Rails)

まずはじめに

Pay.jpとは
シンプルなAPIと豊富なライブラリで簡単にクレジットカード決済を導入できます。
ApplePayに対応していたり定期課金を組むことができます。
今回は開発環境での実装をイメージしているので後ほど出てくる各鍵はテストキーを使用しています。

導入

Pay.jpの登録
まずはアカウントを取得をします。
登録完了しログインすると下記のようになります。

pay.jp root_view.png

gemのインストール

Gemfile
gem 'payjp'
```:fist_tone1::point_up:
**インストール**

bundle install
```

環境変数の設定

まず、プロジェクト直下に.envファイルを新たに作成し、以下のように編集しましょう。

PAYJP_PUBLIC_KEY='自身のアカウントのテスト公開鍵'
PAYJP_SECRET_KEY='自身のアカウントのテスト秘密鍵'

各キーはPay.jpマイページのAPIより確認ができます。
Pay.jp api_view.png

そしてこの.envファイルをGithubにあげないよう .gitignoreに下記追記をします。

.gitignore
/.env

controller

支払い機能を管理するコントローラーを作成しpayアクションを定義します。
私の場合はPurchasesControllerを作成し記載しております。

app/controllers/purchases_controller.rb
  def index
  end

  def pay
    Payjp.api_key = ENV["PAYJP_SECRET_KEY"]
    Payjp::Charge.create(
      amount: params[:amount],
      card: params['payjp-token'],
      currency: 'jpy'
    )
  end

Charge.createで売り上げ作成処理をしているのかと思います。
amountは売り上げ金額(ここではviewから取得したparams[:amount]を売上高とします。)、
cardはクレジットカードのトークンを使っての決済を表し、
currencyは 'jpy'とすることで日本円での決済としています。

また、indexに「カードで支払う」ボタンを設置します。

ルーティング

payアクションのルートを追記します。

route.rb
resources :purchases
post 'purchases/pay' => 'purchases#pay'

view

ここまできたらあとはビューに支払い用のモーダルを設置する処理をするだけですね。

app/views/purchases/index.html.haml
= form_with local: true, url: purchases_pay_path do |form|
  = form.number_field :amount
  %script.payjp-button{"data-key" => "自身のアカウントのテスト公開鍵", src: "https://checkout.pay.jp", type: "text/javascript"}

なんとこれだけでindex.html.hamlに表示される「カードで支払う」ボタンを押すだけで下記のようなモーダルが出てくるんです。
Pay.jp modalview.png

忘れずに支払い完了後のviewも用意します。

app/views/purchases/pay.html.haml
支払いが完了しました

= link_to 'Topへ', root_path

ここまで完了したら実際に試してみましょう!
index.html.hamlに記載した「カードで支払う」ボタンを押して、モーダルを開き必要な情報を入力します。
カード番号はあらかじめPay.jpで用意しているテスト用の共通カード番号'4242 4242 4242 4242'、
有効期限は現在から未来の日付、CVC番号は3桁の適当な数字、名前も適当な名前を入力して「カードで支払う」ボタンをクリック。

すると下記のようにpay.html.hamlの画面になれば完了です。
※CSSを当ててないのでシンプルですがご了承ください。

pay.jp paied_view.png

実際にPay.jpにアクセスし売り上げの画面を見て、支払い済みとなっていれば問題ないです。

さいごに

今回は開発環境についてですが、本番環境の際はもう少し考慮する点はあるかと思います。
が、皆さんならやってくれると信じてます。

ここから発展して定期課金などはまたの機会でご紹介できればなんて思ってます。

ありがとうございました。

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

Railsチュートリアルメモ - 第8章

メモの目次記事はこちら

Railsチュートリアル8章へのリンク

第7章からだいぶ日にちが空いてしまった。。。
気を取り直して最後まで完走していく

第8章 基本的なログイン機構

8.1 セッション

cookieを利用したセッションの実現方法についての章

ポイント

  • ユーザー登録と違い、名前付きルートではなく、個別指定でルーティングを指定する
  • flash変数の設定後の画面表示をredirect_toではなく、renderにするとflashメッセージが消えないが、flash.nowにすると次のリクエストでメッセージが消える

8.2 ログイン

ポイント

  • Railsで事前定義済みのsessionメソッドが利用できる
    • session[:user_id] = user.id
  • User.find(session[:user_id])を使うと、userが存在しないときに例外が発生するので、User.find_by(id: session[:user_id])を使用する
  • helperにログイン用のメソッド、ログイン情報取得用のメソッドを追加し、どこからでも呼び出せるようにする
  • 余計なDBアクセスを避けるため、||=を使用して、非ログインのときのみDBアクセスが発生するようにする
  • test/fixtures/の中のymlに定義することで、都度DBに登録しなくても、DB登録ユーザーのようにユーザー情報のテストを行うことができる
  • ヘルパーメソッドはテストから呼び出せない

8.3 ログアウト

ポイント

ログアウトでやることは①sessionから:user_idを消す②@current_userインスタンス変数を消す(nilで上書く)の2つ

  def log_out
    session.delete(:user_id)
    @current_user = nil
  end

8.4 最後に

割愛

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

Ruby on rails個人的備忘録

はじめに

私がRuby on Railsについてまとめたいと思い書いた備忘録です。
読む価値はあまりありません。

Ruby on Railsでアプリ作ってみたいと思い手を出しました。
が、流れが段々掴めなくなってきたので基礎から私なりに整理して書いていきます。

色々端折って書いてます。

Ruby on Rails

そもそもRuby on Railsとはなんやねんってところから始めます。

Ruby on Rails(以下Rails)とはWebアプリケーションを作成する際の骨組みを作ってくれるものです(フレームワークというらしいです)。
RailsではMVCアーキテクチャという設計方法でプログラムを書いていきます。こんな感じです。
Mとはモデル(Model)といいDBのデータを扱うオブジェクトです。Vはビュー(View)といいHTMLなどをテンプレートとしてブラウザに返すものです。Cはコントローラ(Controller)といいモデルからのデータを受け取ってビューに渡すものです。以下に図を示します。ナンバリングは気にしないで下さい。
image.001.jpeg.001.jpeg
モデルの必要性として、DBに不正な値が紛れ込まないかなどをチェックすることができアプリケーションのセキュリティ性を高めることが出来ます。
コントローラはデータに対して各処理を施したり、ビューが返す適切なテンプレート(画面の表示方法みたいなもの?)を選択したりします。これらはコントローラ内のアクションというもので行います。
このように、Webアプリケーション内で細かくロールを決めることで作業効率を上げることができ、またプロジェクト全体の可読性も高くなります。

まずは基本から

ここから先は、私が学んだRailsに関する知識とかについて綴っていきます。プログラムを書くことは少ないのでご了承下さい。

どんなものを作るか

何作るか考えてないのにものが作れるわけありません。適当に考えてみます。なんか表示させたいだけとかでもいいです。大事なのは仕様を決めることです。どのコントローラとアクション、モデル、ビューで仕様を実現するか考えることです。使わなくてもいいものもありますし、複数使うこともあるかも知れません。考え方については私自身手探りで行ってますので正しくないかも知れません。
まず、画面に何を出すか決めます。今回はおなじみの"Hello World!"を表示することにします。トップページに表示するので、コントローラ名はTopにします。アクションはindexとします。Hello World!を表示するだけなので、DBは使わなそうですね。よって今回はモデルは使いません。
ビューは使います。Hello World!をどんな文体で表示させようかなとか、中央に配置させようかなとか考えます。

ルーティングの設定

ルーティング(routing)とはWebブラウザに送られてきたリクエスト(GETとかPOSTとか)をどのコントローラのどのアクションに対して任せるかという関連付けを行うところです。これをしないとWebのトップページすら作れません(多分)。
ここではrootというメソッドを使います。rootでどのコントローラのどのアクションで行うかを設定します。
アプリのトップページを表示するようなアクションはこのように書きます。

routes.rb
Rails.application.routes.draw do
  root "top#index"
end

#の左側でコントローラ名を、右側でアクション名をしています。
コントローラもアクションも定義していないので、次はこれを書きます。
indexという名前についてはRESTという概念に則り命名しています。RESTについてはまだ理解しきってないので後々書くことにします。

コントローラ作成/アクション定義

Ruby on Railsではコントローラを1から書かなくても、コマンドを打つことである程度の部分までコントローラを作ってくれます。モデルも作ってくれます。ターミナルでコマンドを打ち込みコントローラtopを作成します。コントローラはtop_controller.rbというスネークケースで保存されます。クラス名はTopControllerのようにキャメルケースで書かれます。
このファイルはapp/controllers/に置かれます。

top_controller.rb
class TopController < ApplicationController
  def index
    render action: "index"
  end
end

renderメソッド(Railsには様々なメソッド(関数)があります。いきなり出てきて「知らねー」という気持ちになりますが堪えましょう)はHTMLを生成するメソッドです。action: "index"は「indexアクション用のテンプレートを用いて下さい」という意味になります。
indexというアクションはtop_controller.rbに書かれたアクションですね。これに対するテンプレートを作成しましょう。

ビューの作成

私が読んでいる参考書ではERBというライブラリを用いてテンプレートを作成するERBテンプレートを用いていたのでそちらを使用していきます。ERBテンプレートは適当な名前では使えません。同じコントローラ、同じアクションに対応させるようにテンプレートを配置させる必要があります。app/views/top(コントローラ)/にindex(アクション名).html.erbという名前で配置します。

index.html.erb
<% @title = "Hello World!"%>
<h1><%= @title %></h1>

ここまで書いたらコンソールでrails sコマンドを実行しサーバを立ち上げ結果をみます。

流れ

①ルーティングでどのコントローラにどのアクションにやってもらうか決めます。
②コントローラとアクションを定義します。(得たデータの加工などはここで行います)
③必要ならばモデルも定義します。(モデルについては分かり次第追記)
④ビューします。

最後に

現在の私の記事は他の方がみても何の価値もない備忘録ですが、将来的には誰が読んでも分かるような記事に仕上げていきたいと思っています。精進していきます。

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

each文とrender のcollectionオプション[備忘録]

はじめに

掲示板アプリを作成しているのだが、
いいね機能実装時、

https://qiita.com/hayabusa3703/items/2b916e652a1dc85bb6e3

を参考に(ほぼ写して)、コードを書いていた。

機能自体の実装は成功したが、ビューでの表示が思うようにいかない。

各投稿一つ一つに、全ての投稿のイイねボタンがついてしまった。

これに対処するにあたって、
今までおざなりにしていた、renderとそのオプションについての理解がかなり深まったので、備忘録として残す。

バージョンなど

ruby 2.5.1
rails 5.2.4.1
bootstrap 4.4.1
haml-rails 2.0.1
jquery-rails 4.3.5

コード

posts_controller.rb
def index
    @posts = Post.all.includes(:user).order('created_at DESC')
  end
index.html.haml
.events__wrapper.row
        /# each文
      - @posts.each do |post|
        .events__content.col-sm-6.col-md-3.mb-3
          .card{id: post.id}
            %label.m-1
              - if post.image
                %img.card-img-top{src: "#{post.image}"}
              - else
                %img.card-img-top{src: "/public/noimage.jpeg"}
              .card-body.event
                %h5= link_to "#{post.title}", post_path(post.id), class: "event-title stretched-link text-decoration-none"
                .event__name 
                  #{post.user.name} さん
                .text-right
                  = l post.created_at, format: :long
                  = render partial: '/posts/posts', collection: @posts, as: :post  

each文の中に、renderとオプションでcollectionを使っている形になっている。

この書き方だと、先述の通り、一つのpostにイイねボタンがいくつもついてしまう。

原因を調べていると発見した、とてもrenderとオプションについてまとめてあるqiitaの記事があるので共有しておきます。

https://qiita.com/takeru56/items/299850d0f054ce107e21

この記事を読んで、collectionオプションは変数に自動でeachメソッドを使ってくれていることに気付き、renderの記述を修正。

index.html.haml
= render partial: '/posts/posts', locals: {post: post}
/# これにより、元々あったeach文の中の変数postを部分テンプレートに渡せる。

まとめ

イイね機能の実装を通じて、
collection, locals, object, as, などのオプションの理解が深まった。

エラーの数だけ成長がある!!!

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

RailsアプリケーションにSlimを導入する方法

目的

RailsアプリケーションのテンプレートエンジンをerbからSlimに変更.
具体的には以下のことをしたい.

  1. slimを導入
  2. 既存のerbをslimに変更
  3. rails g controller(or scaffold)した時にerbではなくslimを自動生成するようにする

環境

MacOS High Sierra 10.13.6
Rails : 5.2.4.1
Ruby : 2.6.5

1. slimを導入

Gemfileに以下を追記.

gem 'slim-rails'
group :development do
 (省略)
    gem 'html2slim'
end

gem 'slim'も必要と思ってしまいがちですが,slim-railsslimに依存しているため,上記のように書けばbundlerさんが勝手にslim gemもインストールしてくれます.

slim-railsrails g controller(or scaffold)した際にslimも自動生成してくれるgem.つまり最初に書いた3がもう実現できているわけです.このgemのおかげでconfig/application.rbの編集が不要になるので楽.
html2slimを導入することでerb2slimというコマンドによってerb→slimの変換が行えるように.

そして以下を実行.

$ bundle install

2.既存のerbをslimに変更

$ bundle exec erb2slim app/views app/views -d

-dオプションをつけると,既存のerbファイルを消去してくれます.

3. rails g controller(or scaffold)した時にerbではなくslimを自動生成するようにする

1でも書いたように,slim-railsを導入した時点でこれは達成されています.

目的達成

gemを適切にインストールすればconfigとかいじらなくていいので楽.
ゴリゴリslimで書いていきましょう.

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

Railsの静的コード解析をGitHub Actionsでやる

これはなにか

GitHub に push すると GitHub Actions がブンブン回って、静的コード解析をしてくれるやつ。ついでにキャッシュされるので、毎回 bundle install がまわることがないやつ。はやい、やすい、うまい ... かどうかはわからないが、要はオレによし、オマエによし。

ワークフロー

name: Static Check 

on: [push]

jobs:
  RuboCop:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7'
    - uses: actions/checkout@v2
    - uses: actions/cache@preview
      with:
        path: ./web/vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: Run RuboCop
      run: |
        cd ./web/
        bundle install --jobs 4 --retry 3 --path vendor/bundle
        bundle exec rubocop -a
  BrakeMan:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7'
    - uses: actions/checkout@v2
    - uses: actions/cache@preview
      with:
        path: ./web/vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: Run BrakeMan
      run: |
        cd ./web/
        bundle install --jobs 4 --retry 3 --path vendor/bundle
        bundle exec rubocop -a
  RubyCritic:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/setup-ruby@v1
      with:
        ruby-version: '2.7'
    - uses: actions/checkout@v2
    - uses: actions/cache@preview
      with:
        path: ./web/vendor/bundle
        key: ${{ runner.os }}-gem-${{ hashFiles('**/Gemfile.lock') }}
        restore-keys: |
          ${{ runner.os }}-gem-
    - name: Run BrakeMan
      run: |
        cd ./web/
        bundle install --jobs 4 --retry 3 --path vendor/bundle
        bundle exec rubycritic

おわりに

ほんとは Docker 化しているのだから、Docker 上で動かせば良いのだろうけど Docker イメージの置き場所とか考えると、めんどくさくなったのでこうした。次は GitHub Actions で Docker image をロードして CI するやつでもつくろうかな。

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

chat-spaceを作ろう①

アプリケーションを立ち上げる

ターミナル
rails new chat-space -d mysql
アプリ立ち上げ アプリ名 データベース指定
cd ~/ディレクトリを移動

rails db:create
データベース作成

事前準備

Hamlを導入する

gemfile
gem 'haml-rails'
ターミナル
bundle install
rails haml:erb2haml
拡張子.erbのファイルを,hamlになる

sassを準備する

app/assets/stylesheets/application.css
の中身を全て削除し、拡張子を.scssに変更

reset scssの設定(今回はYUI3を使用)

assets/stylesheetsディレクトリ内に部分テンプレート_reset.scssファイルを作成
その中にYUI3をコピペする

assets/stylesheets/application.scss
@import "./reset";
作成した_reset.scssファイルを読み込む

application.scssに読み込むことでアプリケーション全体に適用される様になる

今日はここまで!
見本サイト

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

Ruby 2.6.5 and Rails 6.0.2 - Installing on Windows 10

概要

Windows 10環境にRubyとRailsをインストールしたときのメモです。MSYS2のインストール時に少し手間取ったので、記録の意味で記事にしました。

環境

  • Windows 10 Professional
  • Ruby 2.6.5 with Devkit
  • Rails 6.0.2.1

事前にインストールの必要なプログラム

Railsでプロジェクトを作成し起動するのに、事前にインストールしておく必要のあるプログラムです。
バージョンの確認はそれぞれコマンドプロンプトから行いました。

Git

WindowsなのでGit for Windowsをインストールします。(インストール方法は省略します。)

> git --version
git version 2.25.1.windows.1

Node.js

Node.jsも必要です。私の場合はnodistでインストールしました。(インストール方法は省略します。)

> node -v
v12.16.1

yarn

Railsではyarnが必要とのことなのでyarnよりWindows版のインストーラーをダウンロードしてインストールしました。
ダウンロードしたファイルはyarn-1.22.0.msiです。

> yarn -v
1.22.0

Rubyのインストール

RubyInstaller for Windowsより、devkit付きのインストーラーをダウンロードしてインストールしました。
ダウンロードしたファイルはrubyinstaller-devkit-2.6.5-1-x64.exeです。

インストール

インストーラーを実行してインストールを進めます。
r1.png

インストール先はデフォルト(C:\Ruby26-x64)のままにして、3つ目のチェックボックス(Use UTF-8 as default external encoding.)にチェックを入れます。
r2.png

MSYS2も必要なのでMSYS2 development toolchain 2019-10-01にチェックを入れたままにします。
r3.png

インストールが始まるのでしばらく待ちます。
r4.png

Run 'ridk install' to setup MSYS2 and development toolchain.にチェックを入れたままFinishボタンをクリックします。
r5.png

この画面が表示されたらENTERを押してインストールを進めます。
r6.png

MSYS2のインストールで少し手間取ったので、その時の状況を記します。

このインストール作業を行っているPCではセキュリティソフト(ウィルスバスター)がインストールされているのですが、セキュリティが機能している状態だとMSYS2のインストールが正常に終わりませんでした。
下図がエラーが起きたときの画面です。
r7.png
インストールを正常に行うには、セキュリティソフトの例外設定を行いインストール先のディレクトリ(C:\Ruby26-x64)を監視の対象から外します。
また、念のためインストールしたRubyをアンインストールし、且つC:\Ruby26-x64ディレクトリをエクスプローラーから削除します。PCの再起動後もう一度インストールを行います。

正常にインストールが進むと下図のような画面になります。
r9.png

正常終了したときの状態です。もう一度ENTERを押して終了します。
r10.png

インストールしたRubyのバージョン

インストールが完了したらスタートメニューに登録されているStart Command Prompt with Rubyでプロンプトを立ち上げ、rubyとgemのバージョンを確認します。

> ruby -v
ruby 2.6.5p114 (2019-10-01 revision 67812) [x64-mingw32]
> gem -v
3.0.3

Railsのインストール

インストールはそれぞれgemで行います。

bundler

bundlerはすでにインストールされていましたが、新しいバージョンが出ているのでインストールし直します。

> gem list bundler

*** LOCAL GEMS ***

bundler (default: 1.17.2)

> bundler -v
Bundler version 1.17.2

新しいバージョンをインストールします。

> gem install bundler
Fetching bundler-2.1.4.gem
Successfully installed bundler-2.1.4
Parsing documentation for bundler-2.1.4
Installing ri documentation for bundler-2.1.4
Done installing documentation for bundler after 8 seconds
1 gem installed

> bundler -v
Bundler version 2.1.4

SQLite3

SQLite3が必要なのでインストールします。

> gem install sqlite3
Temporarily enhancing PATH for MSYS/MINGW...
Installing required msys2 packages: mingw-w64-x86_64-sqlite3
Building native extensions. This could take a while...
Successfully installed sqlite3-1.4.2
Parsing documentation for sqlite3-1.4.2
Installing ri documentation for sqlite3-1.4.2
Done installing documentation for sqlite3 after 1 seconds
1 gem installed

> gem list sqlite3

*** LOCAL GEMS ***

sqlite3 (1.4.2)

SQLite3についてはSQLite Home Pageよりバイナリ(.exe、.dll)をダウンロードしてパスを通す必要があるという記事を見かけましたが、私の場合は特に行わず上記のgemでインストールするだけで済みました。

Rails

最後に2020年2月時点で最新のrailsをインストールします。

> gem install rails -v 6.0.2.1

> rails -v
Rails 6.0.2.1

Railsのデモアプリケーション

Getting Started with Railsを参考に、デモアプリケーションを作成し、実行まで行います。

デモアプリケーションの作成

適当なディレクトリ上でコマンドプロンプトを開きrails new blogと入力して実行します。

> rails new blog

// ...省略...

Done in 12.39s.
Webpacker successfully installed ? ?

デモアプリケーションの作成後の状態

> cd blog

blogディレクトリの状態です。プロジェクトの作成が失敗しているとこれらのディレクトリ・ファイルが完全に作成されません。

/blog
  |
  `--- /.git
  `--- /app
  `--- /bin
  `--- /config
  `--- /db
  `--- /lib
  `--- /log
  `--- /node_modules
  `--- /public
  `--- /storage
  `--- /test
  `--- /tmp
  `--- /vendor
  `--- .browserslistrc
  `--- .gitignore
  `--- .ruby-version
  `--- babel.config.js
  `--- config.ru
  `--- Gemfile
  `--- Gemfile.lock
  `--- package.json
  `--- postcss.config.js
  `--- Rakefile
  `--- README.md
  `--- yarn.lock

デモアプリケーションの実行

コマンドプロンプトからrails serverと実行します。画面に出力されている通りhttp://localhost:3000でアプリケーションが起動しているので、ブラウザでアクセスします。
アプリケーションの停止はCtrl + Cを押下します。

> rails server
=> Booting Puma
=> Rails 6.0.2.1 application starting in development
=> Run `rails server --help` for more startup options
*** SIGUSR2 not implemented, signal based restart unavailable!
*** SIGUSR1 not implemented, signal based restart unavailable!
*** SIGHUP not implemented, signal based logs reopening unavailable!
Puma starting in single mode...
* Version 4.3.1 (ruby 2.6.5-p114), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://[::1]:3000
* Listening on tcp://127.0.0.1:3000
Use Ctrl-C to stop

アプリケーションが正常に起動していれば図のページが表示されます。
r11.png

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