- 投稿日:2020-02-26T22:38:37+09:00
Ruby/GTK3 - SpinButton
gem install gtk3
SpinButton
Gtk.SpinButtonでは2つの矢印のいずれかをクリックして、表示されている値を増減する。直接値を入力することもできる。
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
- 投稿日:2020-02-26T22:37:57+09:00
呼び出す側?呼び出される側?ポリモーフィズムがやっとわかった?
はじめに
オブジェクト指向を学ぶ際に薦められた本「オブジェクト指向でなぜつくるのか」を読んでいる際に、「ポリモーフィズム」への理解に時間がかかったのでまとめておこうと思います。実際にこの本を読んでみてオブジェクト指向に対するもやもやがすっきりしました。おすすめですのでぜひ読んでみてください!
注意
この記事はポリモーフィズム自体は解説はしません。ポリモーフィズムを解説している良い記事は他にあると思いますので、そちらをご覧ください。この記事はポリモーフィズムに関する「呼び出す側と呼び出される側」の僕がつかんだイメージを書き残したものです。間違いがあるかもしれないので、もしあったらコメントしていただけるとありがたいです!
ポリモーフィズム?
「オブジェクト指向でなぜつくるのか」によれば、
ポリモーフィズムはサブルーチンを呼び出す側のロジックを一本化する仕組み、すなわち「共通メインルーチン」を作るしくみである。
ん?となると思いますが、もちろん実際にこの本の流れに沿って読めば理解できます。
サブルーチンは「プロシージャ、関数、副手続き」などさまざまな呼び名がありますが、僕は「関数」のイメージでとらえています。
さらに、本の中では共通メインルーチンの説明を共通サブルーチンと対比させて、
共通サブルーチン:呼び出す側が増えても、呼び出される側を修正する必要がない
共通メインルーチン(ポリモーフィズム):
呼び出される側が増えても、呼び出す側を修正する必要がない
とてもわかりやすいと思うのですが、僕にはこの「呼び出す側、呼び出される側」のイメージがうまくできませんでした。
そこでコードに書き起こしてみたところイメージができるようになりました。以下のコードはあくまでイメージだと思ってください!ちなみに僕は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...と「呼び出される側」は増えるが、 # メソッドを「呼び出す側」のロジック(形式、見た目)は変わらない以上で、イメージの説明は終わりです。「呼び出す側」のロジックが一本化されているため、定義されているメソッドは、「呼び出される側」が何(のクラス)であるかを気にせず(内部で自動で判断して)使うことができます。
以上で、ポリモーフィズムの「呼び出す側」「呼び出される側」のイメージの説明が終わりです。
たぶん多くの人がポリモーフィズムに関してすんなり理解できたと思うのですが、僕は変な部分でつまづいてしまいました。誰かの参考になると嬉しいです!間違いがあったらご指摘ください!
- 投稿日:2020-02-26T21:24:57+09:00
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を確認すると対応が書いてありました。
解決策
Gemfilegem 'sassc'こちらを記述すれば良いみたいです。
その後bundle installすると、無事完了しました。原因
・sassって?
後日記載します
- 投稿日:2020-02-26T21:24:52+09:00
Ruby/GTK3 - LinkButton
gem install gtk3
LinkButton
ウェブブラウザで使用されるハイパーリンクのようなボタン。
クリックすると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
- 投稿日:2020-02-26T21:07:26+09:00
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がエラーになる件
- 投稿日:2020-02-26T20:01:34+09:00
【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 %>これでログインユーザーだけがログアウトできて、ログインしていないユーザーだけが新規登録やログインができます!
- 投稿日:2020-02-26T19:31:20+09:00
画像一覧表示で指定の枠内でスクロールさせる方法
現在スクールにてプログラミングを学習中
目標は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-を追加する記述で最低の枠の大きさを固定でき
指定した大きさの枠内でクスロールしてくれる。これでスクロール完了です。
- 投稿日:2020-02-26T18:17:59+09:00
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"なお上記のコードは、要点だけに絞っている。そのため、コピペでは動かないのは、予めご了承いただきたい。
これでおしまい
ポートの設定を端折ってしまった。そこらへんは、ココでは記事にしない。途中で記事を書くのがめんどくさくなったからね。ググるかなにかしてください。そんじゃねー。
タイトルについて
スタパ斉藤マジリスペクト、というわけでなく、冗談抜きでこんなタイトルしか思いつかなかった。
- 投稿日:2020-02-26T17:26:41+09:00
【未経験転職】【① 3-4月編】2020年3月末でプログラマー目指して退職する31歳公務員がロードマップを立ててみた!
はじめに
みけた@プログラマー転職、公務員31歳です!
仕事をしていく中で「これじゃない感」が募っていく中、
無謀にもプログラマー転職を目指して、退職願を提出してしまいました!!!とりあえず、5月からはプログラミングスクール「Dive into Code」さんに
お世話になる方向で検討中です。が、しかし!
それまでの繋ぎの期間にスタートダッシュを切る必要があるということで、
そのロードマップを作成してみました。プログラマー転職に向けてのロードマップ(3〜4月)
○ 学習計画
○ 学習時間
スケジュールを確認し、プログラミングのための学習時間を以下のように設定しました。
就業中であるため、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月も勉強をしたタイミングで適宜情報発信していきます。
ツイッターアカウントはこちら
- 投稿日:2020-02-26T17:17:07+09:00
image画像を一覧表示させる
画像の一覧表示の実装について実装
現在、プログラミングスクールにてフリマアプリを5名で実装中
少し手間取ったホーム画面の一覧表示の実装手順を載せます。
フロント実装は完了済みとします。開発環境
rails 5.2.4.1
ruby 2.5.1マークアップはhamlで行いました。
※アウトプットの為記述
※初学者向けに記述します完成イメージ
※載せている写真は動物ですがあくまでテスト画像として載せているだけです。
予めご了承ください。まずはコントローラの記述から
今回は一覧の表示をしたいので対象の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の最初のデータを取得したかった為、上記の?のように追記いたしました。
この記述でデータを取得し表示まではできました。
あとはスクロールで画像がうまくスクロールするようにいたしました。
長くなりますのでスクロールは別の記事に載せたいと思います。
- 投稿日:2020-02-26T16:41:02+09:00
【やってみた】未経験エンジニアのPay.jp導入(Ruby on Rails)
まずはじめに
Pay.jpとは
シンプルなAPIと豊富なライブラリで簡単にクレジットカード決済を導入できます。
ApplePayに対応していたり定期課金を組むことができます。
今回は開発環境での実装をイメージしているので後ほど出てくる各鍵はテストキーを使用しています。導入
Pay.jpの登録
まずはアカウントを取得をします。
登録完了しログインすると下記のようになります。gemのインストール
Gemfilegem 'payjp' ```:fist_tone1::point_up: **インストール**bundle install
```環境変数の設定
まず、プロジェクト直下に.envファイルを新たに作成し、以下のように編集しましょう。
PAYJP_PUBLIC_KEY='自身のアカウントのテスト公開鍵' PAYJP_SECRET_KEY='自身のアカウントのテスト秘密鍵'そしてこの.envファイルをGithubにあげないよう .gitignoreに下記追記をします。
.gitignore/.env
controller
支払い機能を管理するコントローラーを作成しpayアクションを定義します。
私の場合はPurchasesControllerを作成し記載しております。app/controllers/purchases_controller.rbdef index end def pay Payjp.api_key = ENV["PAYJP_SECRET_KEY"] Payjp::Charge.create( amount: params[:amount], card: params['payjp-token'], currency: 'jpy' ) endCharge.createで売り上げ作成処理をしているのかと思います。
amountは売り上げ金額
(ここではviewから取得したparams[:amount]を売上高とします。)、
cardはクレジットカードのトークンを使っての決済
を表し、
currencyは 'jpy'とすることで日本円での決済
としています。また、indexに「カードで支払う」ボタンを設置します。
ルーティング
payアクションのルートを追記します。
route.rbresources :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に表示される「カードで支払う」ボタンを押すだけで下記のようなモーダルが出てくるんです。
忘れずに支払い完了後の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にアクセスし売り上げの画面を見て、支払い済みとなっていれば問題ないです。
さいごに
今回は開発環境についてですが、本番環境の際はもう少し考慮する点はあるかと思います。
が、皆さんならやってくれると信じてます。ここから発展して定期課金などはまたの機会でご紹介できればなんて思ってます。
ありがとうございました。
- 投稿日:2020-02-26T15:27:16+09:00
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 end8.4 最後に
割愛
- 投稿日:2020-02-26T14:53:36+09:00
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)といいモデルからのデータを受け取ってビューに渡すものです。以下に図を示します。ナンバリングは気にしないで下さい。
モデルの必要性として、DBに不正な値が紛れ込まないかなどをチェックすることができアプリケーションのセキュリティ性を高めることが出来ます。
コントローラはデータに対して各処理を施したり、ビューが返す適切なテンプレート(画面の表示方法みたいなもの?)を選択したりします。これらはコントローラ内のアクションというもので行います。
このように、Webアプリケーション内で細かくロールを決めることで作業効率を上げることができ、またプロジェクト全体の可読性も高くなります。まずは基本から
ここから先は、私が学んだRailsに関する知識とかについて綴っていきます。プログラムを書くことは少ないのでご了承下さい。
どんなものを作るか
何作るか考えてないのにものが作れるわけありません。適当に考えてみます。なんか表示させたいだけとかでもいいです。大事なのは仕様を決めることです。どのコントローラとアクション、モデル、ビューで仕様を実現するか考えることです。使わなくてもいいものもありますし、複数使うこともあるかも知れません。考え方については私自身手探りで行ってますので正しくないかも知れません。
まず、画面に何を出すか決めます。今回はおなじみの"Hello World!"を表示することにします。トップページに表示するので、コントローラ名はTop
にします。アクションはindex
とします。Hello World!
を表示するだけなので、DBは使わなそうですね。よって今回はモデルは使いません。
ビューは使います。Hello World!
をどんな文体で表示させようかなとか、中央に配置させようかなとか考えます。ルーティングの設定
ルーティング(routing)とはWebブラウザに送られてきたリクエスト(GETとかPOSTとか)をどのコントローラのどのアクションに対して任せるかという関連付けを行うところです。これをしないとWebのトップページすら作れません(多分)。
ここではroot
というメソッドを使います。root
でどのコントローラのどのアクションで行うかを設定します。
アプリのトップページを表示するようなアクションはこのように書きます。routes.rbRails.application.routes.draw do root "top#index" end
#
の左側でコントローラ名を、右側でアクション名をしています。
コントローラもアクションも定義していないので、次はこれを書きます。
index
という名前についてはRESTという概念に則り命名しています。RESTについてはまだ理解しきってないので後々書くことにします。コントローラ作成/アクション定義
Ruby on Railsではコントローラを1から書かなくても、コマンドを打つことである程度の部分までコントローラを作ってくれます。モデルも作ってくれます。ターミナルでコマンドを打ち込みコントローラ
top
を作成します。コントローラはtop_controller.rb
というスネークケースで保存されます。クラス名はTopController
のようにキャメルケースで書かれます。
このファイルはapp/controllers/に置かれます。top_controller.rbclass 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
コマンドを実行しサーバを立ち上げ結果をみます。流れ
①ルーティングでどのコントローラにどのアクションにやってもらうか決めます。
②コントローラとアクションを定義します。(得たデータの加工などはここで行います)
③必要ならばモデルも定義します。(モデルについては分かり次第追記)
④ビューします。最後に
現在の私の記事は他の方がみても何の価値もない備忘録ですが、将来的には誰が読んでも分かるような記事に仕上げていきたいと思っています。精進していきます。
- 投稿日:2020-02-26T13:42:25+09:00
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.rbdef index @posts = Post.all.includes(:user).order('created_at DESC') endindex.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: :posteach文の中に、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, などのオプションの理解が深まった。エラーの数だけ成長がある!!!
- 投稿日:2020-02-26T13:13:09+09:00
RailsアプリケーションにSlimを導入する方法
目的
RailsアプリケーションのテンプレートエンジンをerbからSlimに変更.
具体的には以下のことをしたい.
- slimを導入
- 既存のerbをslimに変更
- rails g controller(or scaffold)した時にerbではなくslimを自動生成するようにする
環境
MacOS High Sierra 10.13.6
Rails : 5.2.4.1
Ruby : 2.6.51. slimを導入
Gemfileに以下を追記.
gem 'slim-rails' group :development do (省略) gem 'html2slim' end
gem 'slim'
も必要と思ってしまいがちですが,slim-rails
がslim
に依存しているため,上記のように書けばbundlerさんが勝手にslim
gemもインストールしてくれます.
slim-rails
はrails g controller(or scaffold)
した際にslimも自動生成してくれるgem.つまり最初に書いた3がもう実現できているわけです.このgemのおかげでconfig/application.rb
の編集が不要になるので楽.
html2slim
を導入することでerb2slim
というコマンドによってerb→slimの変換が行えるように.そして以下を実行.
$ bundle install2.既存の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で書いていきましょう.
- 投稿日:2020-02-26T02:00:22+09:00
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 するやつでもつくろうかな。
- 投稿日:2020-02-26T00:28:47+09:00
chat-spaceを作ろう①
アプリケーションを立ち上げる
ターミナルrails new chat-space -d mysql アプリ立ち上げ アプリ名 データベース指定 cd ~/ディレクトリを移動 rails db:create データベース作成事前準備
Hamlを導入する
gemfilegem '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に読み込むことでアプリケーション全体に適用される様になる
今日はここまで!
見本サイト
- 投稿日:2020-02-26T00:20:17+09:00
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.1Node.js
Node.jsも必要です。私の場合はnodistでインストールしました。(インストール方法は省略します。)
> node -v v12.16.1yarn
Railsではyarnが必要とのことなのでyarnよりWindows版のインストーラーをダウンロードしてインストールしました。
ダウンロードしたファイルはyarn-1.22.0.msi
です。> yarn -v 1.22.0Rubyのインストール
RubyInstaller for Windowsより、devkit付きのインストーラーをダウンロードしてインストールしました。
ダウンロードしたファイルはrubyinstaller-devkit-2.6.5-1-x64.exe
です。インストール
インストール先はデフォルト(
C:\Ruby26-x64
)のままにして、3つ目のチェックボックス(Use UTF-8 as default external encoding.
)にチェックを入れます。
MSYS2も必要なので
MSYS2 development toolchain 2019-10-01
にチェックを入れたままにします。
Run 'ridk install' to setup MSYS2 and development toolchain.
にチェックを入れたままFinish
ボタンをクリックします。
この画面が表示されたらENTERを押してインストールを進めます。
MSYS2のインストールで少し手間取ったので、その時の状況を記します。
このインストール作業を行っているPCではセキュリティソフト(ウィルスバスター)がインストールされているのですが、セキュリティが機能している状態だとMSYS2のインストールが正常に終わりませんでした。
下図がエラーが起きたときの画面です。
インストールを正常に行うには、セキュリティソフトの例外設定を行いインストール先のディレクトリ(C:\Ruby26-x64
)を監視の対象から外します。
また、念のためインストールしたRubyをアンインストールし、且つC:\Ruby26-x64
ディレクトリをエクスプローラーから削除します。PCの再起動後もう一度インストールを行います。正常終了したときの状態です。もう一度ENTERを押して終了します。
インストールした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.3Railsのインストール
インストールはそれぞれ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.4SQLite3
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.1Railsのデモアプリケーション
Getting Started with Railsを参考に、デモアプリケーションを作成し、実行まで行います。
デモアプリケーションの作成
適当なディレクトリ上でコマンドプロンプトを開き
rails new blog
と入力して実行します。> rails new blog // ...省略... Done in 12.39s. Webpacker successfully installed ? ?デモアプリケーションの作成後の状態
> cd blogblogディレクトリの状態です。プロジェクトの作成が失敗しているとこれらのディレクトリ・ファイルが完全に作成されません。
/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