- 1. RubyもRailsもSQLも知らんC++erですがいきなり戦いを挑んでみた
- 2. 予約可能と予約不可で色分けをする
- 3. railsでAjaxが上手く連動してくれない時の対処法の1つ
- 4. コントローラーの単体テストコードの概念!
- 5. キーワード検索とタグ機能の両立
- 6. Migrationファイルを操作する
- 7. Ruby on Railsで郵便番号から住所を自動入力する
- 8. Mac上のRubyコードからクリップボードを操作する
- 9. Progate Ruby on Rails5 IV ~ V 個人的ざっくりまとめ
- 10. 【Ruby】二次元配列に要素を代入すると、他の要素まで変更されてしまうときの対処法
- 11. アソシエーションについて!
- 12. 初めてのオリジナルアプリ【My内閣】
- 13. 1対多の要素を1つのviewで登録する/個人開発のつづき
- 14. ユーザーのURLをmyapp.com/usernameとかmyapp.com/settingsみたいなナウい感じにしたい(Rails)
- 15. 【Rails】「教材シェア」アプリを作成しました②
- 16. Rubyでのデバック(binding.pry)の使い方
- 17. Ruby特有のif文
- 18. テストコードについて!
- 19. [Rails]パーシャル内パーシャルのrender繰り返しを防ぐには
- 20. 【Ruby】Qiita デイリー LGTM 数ランキング【自動更新】
RubyもRailsもSQLも知らんC++erですがいきなり戦いを挑んでみた
## はじめに
これまでC++、JavaScirpt、C#、Rustなどなどいろいろな言語を触ってきましたが、Rubyはほとんど触る機会がありませんでした。
またデータベースも`SELECT`文というのがあるくらいの知識しか持っていませんでした。ところでいろいろありお仕事で以下の新しい要素~~しかない~~に満ち溢れている領域への挑戦をすることになりました。
– Ruby
– Rails
– Active Record
– ActionView
– etc
– Rspec
– Factory Girl
– MySQL無事にRailsチョットワカルになれたと思うのでそこで得た知見をまとめてみようかと思います。
## 環境構築
環境構築のはまりポイントもあったのですが職場の手順書が改善されてしまったので(いいことだけど)、書くモチベがないので割愛します。
## haml入門
“`haml
– content_for :main_pane do
= render ‘new’, :setting => @foo_setting
= r
予約可能と予約不可で色分けをする
[1.はじめに](#1-はじめに)
[2.予約画面のイメージ](#2-予約画面のイメージ)
[3.実装](#3-実装)
[4.コード](#4-コード)
[5.おわりに](#5-おわりに)#1. はじめに
予約可能と予約不可で処理を分けたいと考えましたが、思った通りに行かなかったのと、検索しても記事が少なかったのでまとめます。
前提として、sheetの座席はマスターデータとしてDBに保存してあります。
予約テーブル(Reservations)と、座席テーブル(Sheet)が関連づけられています
予約テーブルは座席テーブルにidをsheet_idとして保持します。|Reservations| Sheet |
|:———–|————:|
| sheet_id | id |
| ・ | row |
| ・ |column |#2. 予約画面のイメージ
予約できる場合はオレンジ、予約不可の場合は色を暗くして視覚的にわかりやすくしています。
今回は映画館がモデ
railsでAjaxが上手く連動してくれない時の対処法の1つ
#railsとAjaxが上手く連動してくれない時の確認
現在railsでアプリケーションを作成していて非同期通信を導入しようとしていました。
ですが、何が原因なのか上手く動作する時としない時があり原因不明だったのですが、なんとか解決に導いてもらえたので整理しておくために記録します。“`ruby:jsファイル
function post (){
const submit = document.getElementById(“submit”);
submit.addEventListener(“click”, () => {
const form = document.getElementById(“form”);
const formData = new FormData(form);
const XHR = new XMLHttpRequest();
XHR.open(“POST”, “/posts”, true);
XHR.responseType = “json”;
XHR.send(formData);
});
}
コントローラーの単体テストコードの概念!
#①.結論!
コントローラーのテストは、あるアクションにリクエストを送ったとき、想定通りのレスポンスが生成されるかどうかを確かめる!
という事です!
記述の際は、「リクエストとレスポンス」に着目したテストコードを記述します!
この時に、RSpecの中でもRequest Specと呼ばれる手法を利用します!
#②.Request Spec
RSpecが提供している、コントローラーのテストコードを書くために特化した手法です!
RSpecの導入が完了していれば使用できます!
ちなみに、コントローラーのテストコードは、結合テストコードに記述する内容と、同じような責務を果たすことが多いです!
#③.まとめ
簡単にいうと、Request Specはコントローラーのテストコードを書くことに特化している手法であること!
という事ですね!
記述などは、、また改めて細かく書いて説明するようにします!
何か説明で間違っていたらご指導お願い致します(_ _)
キーワード検索とタグ機能の両立
#前提
キーワード検索機能
GeekSalon教材7-1タグ検索機能
https://qiita.com/MandoNarin/items/5a5610a40c66f77d6c10以上を実装済み
#コード
“`posts_controller.rb
def index
@posts= Post.all
@tags = Tag.all
@posts = @posts.where(“body LIKE ? “,’%’ + params[:search] + ‘%’) if params[:search].present?
#もしタグ検索したら、post_idsにタグを持ったidをまとめてそのidで検索
if params[:tag_ids].present?
post_ids = []
params[:tag_ids].each do |key, value|
if value == “1”
Tag.find_by(name: key).posts.each do |p|
post_ids
Migrationファイルを操作する
Ruby On RailsのMigrationファイルの操作についてまとめ。
すぐ忘れるので。## Migration ファイルを追加
### モデル作成
“`ruby:ターミナル
# モデルを作成
rails g model User name:string introduction:string
“`
“`ruby:db/migrate/XXX_create_users.rb(XXXは作成日時)
class CreateUsers < ActiveRecord::Migration[6.1] def change create_table :users do |t| t.string :name t.string :introduction t.timestamps end end end ``` ```ruby:db/schema.rb ActiveRecord::Schema.define(version: 2021_07_15_224955) do create_table "users", forc
Ruby on Railsで郵便番号から住所を自動入力する
## jp_prefectureとjpostalで住所自動入力を追加しました。
新規にデータを作成する際、住所を自動で入力できると楽だなと思い、使ってみました。
最初なので少しわたわたしたけど、思ったよりは簡単## jQueryの導入
rails6は“jquery-rails“ではなく、yarnから導入する“`ruby:ターミナル
yarn add jquery
“`
environment.jsに設定を追加“`js:config/webpack/environment.js
const webpack = require(‘webpack’)
environment.plugins.prepend(‘Provide’,
new webpack.ProvidePlugin({
$: ‘jquery/src/jquery’,
jQuery: ‘jquery/src/jquery’
})
)
“`
jqueryをimportする“`js:app/javascript/packs/application.js
import Rails f
Mac上のRubyコードからクリップボードを操作する
Macで動くRubyスクリプトを書いていて、処理結果を直接クリップボードに格納したいケースがあった。(Rubyの処理結果をコピペしたかった)
macOSでは、`pbcopy`と呼ばれるクリップボード保存用システムコマンドが用意されていて、
“`shell-session
$ echo ‘piyo’ | pbcopy
“`のように文字列をパイプでpbcopyに渡すことで、クリップボードに文字列を格納することができる。
一方Rubyスクリプトでは、バックスラッシュで囲まれたコードをシステムコマンドとして実行できる:
“`ruby
str = ‘piyopiyo’
`echo #{p str}`=> “piyopiyo\n”
“`これらをまとめると、Mac上のRubyコードからクリップボードを使うことができる:
“`ruby
str = ‘piyopiyo’
`echo #{p str} | pbcopy` # クリップボードにstrが入る
“`
Progate Ruby on Rails5 IV ~ V 個人的ざっくりまとめ
# 投稿の編集
流れは、以下の通り。
①**編集したい投稿を取得**
②**その投稿のcontentの値を上書き**
③**データベースに保存**“`terminal:ターミナル
$ rails console> post = Post.find_by(id: 1) #①
> post.content = “Rails” #②
> post.save #③
“`# フォームに初期値を設定
textareaタグで囲んだ部分を初期値として設定できる。
“`erb
“`特定のアクションで、URLのidと同じidの投稿データをデータベースから取得し、そのcontentの値を初期値に設定したりできる。
“`rb:posts_controller.rb
def edit
@post = Post.find_by(id: params[:id])
end
“`
“`erb:posts/edit.html.erb
【Ruby】二次元配列に要素を代入すると、他の要素まで変更されてしまうときの対処法
# 二次元配列への代入がうまくいかない
3✕3の二次元配列をつくります。
“`ruby
a = Array.new(3, Array.new(3, 0))
p a # => [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
“`見た目上は問題ありませんね。二次元配列ができています。
ですが、要素を代入してみると、
“`ruby
a[0][0] = 1
p a # => [[1, 0, 0],[1, 0, 0],[1, 0, 0]]
“`あれ…??
1つ目の配列の1番目に要素を代入したはずですが、全ての配列の1番目が変わってしまっています。オブジェクトIDを確認してみましょう。
“`ruby
p a.map(&:object_id)
# => [60, 60, 60]
“`3つの配列とも同じオブジェクトになっちゃってます。
これが原因っぽい。# 対処法
mapメソッドを使うことで、上記の問題を回避できます。
“`ruby
a = Array.new(3).map { Array.new(3,0) }p a #
アソシエーションについて!
#①.結論!
アソシエーションとは、モデルを利用したテーブル同士の関連付けのことです!
アソシエーションをモデルに定義することで、そのモデルに紐づく別のモデルの情報へアクセスできるようになります!
それでは、どのように定義するかを見ていきます!
#②.has_manyメソッド
例えばTwitterに考えてみます!
Userモデルの視点で考えると、あるユーザーの作成した投稿は「複数個」ある状態です!
1人のユーザーは複数の投稿を所有しています!
この状態のことをhas manyの関係といい、今回の場合は「User has many Twitters」の状態であると言えます!
この関連付けをするため、userと他のモデルとの間に「1対多」のつながりがあることを示すのがhas_manyメソッドです!
つまり、1人のユーザーは何個も投稿できるので、has_manyという事です!
下記が記述例となります!
“`php:app/models/user.rb
class User < ApplicationRecord devise :database_authenti
初めてのオリジナルアプリ【My内閣】
こんにちは!テックアカデミーのWebアプリコースを受講している駆け出し高校生エンジニアの安田駿介です。
本日、テックアカデミーの受講最終日です。
ギリギリでオリジナルアプリを完成し、合格することができました。
今回は、そのオリジナルアプリを公開していきたいと思います。
なお、このアプリは僕がプログラミングを始めて、一番最初のオリジナルアプリとなっています。
#アプリURLとGitHubのリポジトリ
https://my-naikaku.herokuapp.comhttps://github.com/yasshun1229/my-naikaku.git
#内容
アプリ名は「My内閣」です。
My内閣は、自分だけの内閣を作れるというアプリです。
具体的には、ログインして、内閣作成ページに行き、各閣僚の入力フォームに自分が指定したい人の名前を書くことです。
#開発環境
・AWS
・Cloud9
・Ruby 3.0.0
・Rails 6.1.3.1
・Bootstrap#感想
正直に言うと、このアプリは全て自分で作ったわけではなく、メンターさんから分からないところの
1対多の要素を1つのviewで登録する/個人開発のつづき
# はじめに
ずっとコードを書いていたが、それだけではだいじなことを忘れそうな気がしたので、ここに記録しておこう。今、個人開発で日報アプリをつくろうとしている。ユーザーは日々の記録を書ける。各作業のジャンル、作業名、何時間したかさいごにその日のコメントをつける。ログインした後、reportを登録する。reportひとつに対してreport_itemを複数登録できる。以下のようにしたい。
“`
例:
ユーザー名:satou
登録日: 2021/10/21
report_item 1
ジャンル: Ruby
やったこと: メソッド復習
作業時間: 1時間report_item 2
ジャンル: 英語
やったこと: TOEIC対策
作業時間: 2時間report_item 3
ジャンル: 筋トレ
やったこと: ランニング
作業時間: 0.5時間全体のコメント:
よくできた。“`
これを実現するにはどうすればいいのだろう。ひとつずつやっていくことにした。
# モデルを考える
まずはモデルとその関係性を考えない
ユーザーのURLをmyapp.com/usernameとかmyapp.com/settingsみたいなナウい感じにしたい(Rails)
## やりたいこと
ユーザーのマイページやアカウント設定ページのルーティングをしたいです。
普通にRailsの`resources`メソッドに任せてしまうと、`my_app.com/users/:id`てな具合になってしまいます。でも、ナウいQiitaとかnoteとかだとこんな感じになっています。
“`
https://qiita.com/kakudaisuke
https://qiita.com/settings/accounthttps://note.com/kakudaisuke
https://note.com/settings/account
“`シンプルでかっこいいじゃないですか!
僕のアプリもこうしたい!実装してみて、簡単にできたものの、細かいところの調整がやや面倒だったのでメモを。
### 環境
ruby 2.7.2
Rails 6.1.4.1## 実装!
### routes“`ruby:config/routes.rb
Rails.application.routes.draw do
root ‘posts#index’
#
【Rails】「教材シェア」アプリを作成しました②
## 1.はじめに
閲覧していただきありがとうございます。
前回作成したアプリをさらに改善、機能を追加しました。
そのときの開発の苦悩などをまとめました。
よろしければ、ご覧ください。
## 2.関連URL
アプリ:https://teaching-materials-app.herokuapp.com/
Github:https://github.com/suugakusan/teaching_materials_app
前回のQiita:https://qiita.com/suugakusan/items/15b5b6e9b81726344342
## 3.機能一覧
| |機能 |gem |
|:—: |:—: |:—: |
|1 |ログイン・ログアウト |× |
|2 |アカウント登録 |× |
|3 |教材検索 |× |
|4 |教材投稿 |carrierwave |
|5 |ページネーション |pagy |
|6 |レスポンシブ |Bootstrap |
|7 |ゲストログイン |× |
|8 |記事投稿機能(CRUD
Rubyでのデバック(binding.pry)の使い方
#デバックとは
***デバックとはプログラムにエラーや異常がないかを確認し、修正する***ことです。
***実務ではデバックをしながらプログラムを書いたり、エラーの原因を特定する時に
使います。実務をやる上で必須みたいです。***プログラミング以外でもゲームが完成した後に、想定通りに動くかを
検証したりする仕事があります。デバッカーという仕事です。
このデバッカーがいないと、誤った動作をしたままゲームがリリースされてしまいます。上でも紹介したようにデバックをしないとクライアントにも迷惑をかけてしまう
リスクが出てきます。
プログラマーが開発をする上でデバックをしながら開発していくので必須のスキルとなるので
“`初学者の段階から毎日の学習でデバックを使い慣らしていく必要があります。“`#binding.pryとは
この***binding.pry***がデバックで使うコマンドです。
必須なので抑えておきましょう。#デバックの導入
以下のコマンドでインストールします。“`
gem install pry-byebug
“`
#binding.pryの使い方
*
Ruby特有のif文
Rubyを勉強し始めて1日目
初心者として気になったこと・躓いたことを備忘録として残していこうと思います。#構文
“`ruby:if文
if 条件A
# 条件Aが真だった場合の処理
elsif 条件B
# 条件Bが真だった場合の処理
elsif 条件C
# 条件Cが真だった場合の処理
else
# どの条件に対しても真にならなかった場合の処理
end
“`
:::note warn
複数条件の場合は、else ifではなくelsifです。
:::
JavaScriptなどの言語から勉強している方は注意が必要です。(私も間違えやすい…)##便利な性質
###戻り値を返す
Rubyのif文は戻り値を返すため、変数に戻り値を代入することができます。
以下は時間帯によって表示する挨拶を変更するコード例です。“`ruby:戻り値を変数に代入する
time_zone = ‘夜’greeting =
if time_zone == ‘朝’
‘おはよう’
elsif time_zone == ‘昼’
‘こんにちは’
elsif
テストコードについて!
#①.結論!
テストコードとは、アプリケーション内に記述する、そのアプリケーションの挙動を確認するためのコードのことです!
Ruby on Rails内にも、アプリケーションのテストコードを記述する機能を設けることが出来ます!
その機能は「RSpec」というGemを使うことで便利に実装できます!
#②.なぜテストコードを書くのか?
テストコードを書く意義は大きく分けて2つあります!
1・クオリティの担保ができる!
ブラウザデアピリケーションの挙動を確認するのは、デメリットの方が多いです!
主な理由は3つです!
・人為的なミスが生じるかもしれない!
・仕様が変更した際に、もう1度全部やらないといけない!
・どのように確認したか、記録が残らない!このようなことがあります!
2・仕様を見極めることが出来る!
テストコード書くことが出来れば、アプリケーションの仕様を理解していることになる!主な理由は2つです!
・テストすべき項目を洗い出すときに使用を見極めることが出来る!
・テストコードを書ける人は、仕様を理解している人!以上が、テストコードを書くための理由
[Rails]パーシャル内パーシャルのrender繰り返しを防ぐには
# ハマった点
投稿一覧ページに「いいねボタン」を設置する際、各投稿のパーシャルをrenderする際の繰り返しは、collectionオプションにて解決できた。
しかし、各投稿のパーシャルの中でrenderしているパーシャルにおいては、投稿の分だけrenderの繰り返しが発生してしまう。
↓実際のログ
このrenderのせいで、たった25件の投稿表示に1800ms以上の時間がかかってしまう。しかも、Ajaxによる非同期処理でいいねボタンの切り替えを実装しているため(DRYの観点でも)、いいねボタンをパーシャル化しなければならない。(他に方法があれば知りたいです!) 同じ状況の方も多いのでは?# 解決策
renderの**layoutオプション**と**yieldメソッド**を使うことで解決した。# E
【Ruby】Qiita デイリー LGTM 数ランキング【自動更新】
# 他のタグ
[`AWS`](https://qiita.com/items/8c4aeec4fc98e4b1ba0e) [`Android`](https://qiita.com/items/9c6bf21a9880e242a0d6) [`Docker`](https://qiita.com/items/70aa655b580ed4f91756) [`Git`](https://qiita.com/items/36cfb2318aabe8b3f8df) [`Go`](https://qiita.com/items/16809f8444e0329bed8a) [`iOS`](https://qiita.com/items/da7fabcf41ed103528ae) [`Java`](https://qiita.com/items/9003b8beb47a46292028) [`JavaScript`](https://qiita.com/items/31e7365a838b890f7cc3) [`Linux`](https://qiita.com/items/7bcae94b268b