- 0.0.1. Rubyの基本
- 0.0.2. RSpec+Capybara+selenium+chromedriverでのテスト
- 0.0.3. 【railsチュートリアル】Herokuにデプロイができない/hello,worldからhola,mundoへの変更
- 0.0.4. Ruby-FFIで可変長配列を持つ構造体を使う、またはビットフィールドを使う方法
- 0.0.5. 【自己用メモ】(Ruby)クラス、クラスインスタンス、インスタンス
- 0.0.6. 【Ruby】三項演算子でif文のコードをダイエットしてみた
- 0.0.7. Progate Ruby 学習コースⅡ 修了
- 0.0.8. [Rails] RSpec エラー expected `User.count` to have changed by 1, but was not given a block
- 1. はじめに
- 2. 問題のソースコード
- 2.0.9. RailsにおけるURLの直打ちを阻止する方法
- 2.0.10. Ransackでor検索機能を作る。
- 2.0.11. 【Ruby】3桁の整数を取得しif文を使って条件分岐 ( digitsメソッド )
- 2.0.12. 【Rails】ログイン結果をJSON形式で返す(初学者用)
- 2.0.13. rubyとpythonのif文の書き方の違い
- 2.0.14. サーバーにruby、クライアントにPHPでgRPCを頑張る
- 2.0.15. [Rails] [親子関係] 親を削除した時、子にある外部キーをnilで登録したい
- 2.0.16. [Rails]seed作成でコンパクトに書きたい(%w記法、each_with_index、番号指定パラメータ)
- 2.0.17. [Devise]Deviseのroutingカスタマイズ方法ざっくりまとめた
- 2.0.18. devise使わずユーザー編集・更新機能を実装する
- 2.0.19. 【Ruby on Rails】「||=」←この代入演算子の使い方まとめ
- 2.0.20. deviseのlockableを使うときに意識しないといけないこと
Rubyの基本
###これからRubyの基本について書いていきます。
まず文字列と数値の違いについて解説していきます。
##文字列
こんにちは Hello! 今日は コンニチハ などの数字以外を文字列といいます。入力する際に
‘(シングルクォーテーション)
または
“(ダブルクォーテーション)
で囲みます。例 ”こんにちは” ‘Hello’
##数値
22、777、8 などの数字のことです。
こちらはシングルクォーテーションやダブルクォーテーションで囲む必要はありません。##Rubyにおける加減乗除
文字列の場合は こんにちは と 太郎さん をつなげて、 こんにちは太郎さん としたい時は
“こんにちは” + “太郎さん” とします数値の場合は 5と9を足したい時には
5 + 9とすれば良いですそれでは文字列と数値を足したらどうなるのでしょうか?
こんにちは、今日は24日です。
という文章を足し算で作る際に“こんにちは、今日は” + 24 + “日です。”
とするとエラーが出てしまいます。
数値と文字列は直接は計算できないためです。ではどうするのかというと、
RSpec+Capybara+selenium+chromedriverでのテスト
主にchromedriverの導入に手こずったので記録しておきます。
#Gemfileの設定#
“`ruby:Gemfile
group :test do
gem ‘rspec-rails’
gem ‘capybara’
gem ‘selenium-webdriver’
end
“`
#chromedriverの導入#
①“`terminal
$ brew install chromedriver
“`terminalにて ‘brew install chromedriver’を実行
注意点:(PCのrootディレクトリーで実行すること)
※which chromedriverにでinstall先が見れる②最新版にアップデートする
“`terminal
$ brew update chromedriver
“`#chromeをヘッドレスモードで起動するために#
“`ruby:spec/rails_helper.rb
RSpec.configure dp |config|
#他の記述
config.before(:each)
【railsチュートリアル】Herokuにデプロイができない/hello,worldからhola,mundoへの変更
#課題
rails6.0版チュートリアル1.5.3の演習問題の1番がうまく解けなかった。
>1.3.4.1と同じ変更を行い、本番アプリでも「hola, mundo!」を表示できるようにしてください。
Herokuにhello,world!アプリをデプロイした後に、hola,mondo!アプリをデプロイし直せという問題です。
私なりにhola,mundo!Herokuアクションを作成し、Herokuにデプロイし直したつもりが、
何度やってもブラウザに表示されるのは「hola,mundo!」ではなく、「hello,world!」となってしまう状況でした。#私が犯していたミス
Git hubにファイルをアップロードする手順が誤っていた。
私が行った手順は下記の通りです。①controller作成。holaアクションを追加した。
“`application_controller.rb
class ApplicationController < ActionController::Base def hello render html: "hello,world!"
Ruby-FFIで可変長配列を持つ構造体を使う、またはビットフィールドを使う方法
https://github.com/ffi/ffi/issues/874
Ruby-FFIで可変長配列(variable length array)を持つ構造体(struct)を使う。またはビットフィールド(bitfields)を使う方法。
公式のGithubのissueで相談したところ、開発者の方から方法を教えてもらったので記録として残します。
> こんにちはRuby-FFI開発者!
>
> 素晴らしい仕事をありがとう。
>
> 質問があります。 可変長配列の構造をRubyコードに変換するにはどうすればよいですか?“`c
typedef struct {
uint32_t capacity;
int32_t dp_score, dp_max, dp_max2;
uint32_t n_ambi:30, trans_strand:2;
uint32_t n_cigar;
uint32_t cigar[]; # Here
} mm_extra_t;
“`> もう1つ質問があります。
> ruby-ffi wikiを調べたところ、ビットフィールドはサポートさ
【自己用メモ】(Ruby)クラス、クラスインスタンス、インスタンス
# 用語
各種変数・メソッド用語について。
スコープ情報の不足分は後日追記予定。(頭の中整理して書くの疲れるぅ〜。。:joy:)
おかしなところ、お気づきな点等ございましたら、
お手数ですがご指導ご指摘、頂けますと幸いです:hand_splayed_tone2:“`
class A # Aクラス(通常のクラス)
@@class_variable = “クラス変数”# @class_instance_variable = “クラスインスタンス変数”
# => ここで宣言した場合、「インスタンス変数」ではなく、「クラスインスタンス変数」と見なされる。
# 「インスタンス変数」と同じプレフィックス(@〜)。注:インスタンスメソッド内で呼び出せない。def initialize # インスタンスメソッド
@instance_variable = “インスタンス変数”
puts “#{@instance_variable} at initialize”
enddef hoge # インスタンスメソッド
puts “#{@ins
【Ruby】三項演算子でif文のコードをダイエットしてみた
# 内容
プログラミング言語の演算子のひとつに、三項演算子(条件演算子)という呼ばれるものがあります。
これを使うと、複数行に渡るif文を1行で記述することができるので、モッサリしたコードをダイエットすることができます。この記事ではRubyのコードで書かれた
**「入力された整数が奇数であれば”odd”を、偶数であれば”even”と出力するプログラム」**
を題材としながら、if文で書かれたコードをダイエットしていく様を見て頂きます。まずは、これから書いていくコードのイメージをつくっていきましょう!
“`
if 数字が偶数
evenと表示
else
oddと表示
end
“`以上のような5行に渡るif文を
“`
数字が偶数 ? evenと表示 : oddと表示
“`と1行で書くことができることが三項演算子の特徴です。
# 前提環境
MacOS Catalina 10.15.7
Ruby 2.6.6## if ~ else 文
“`ruby:if.rb
n = gets.to_iif n % 2 == 0
check_numbe
Progate Ruby 学習コースⅡ 修了
##学んだこと
自分用の備忘録メモなので手短に要点だけ…
– 配列の際は [ ] を忘れない
– 配列のインデックス番号は0から始まる。(0,1,2…)
– ハッシュの使い方
– ハッシュの書き方のひとつ「シンボル」
– ハッシュを省略した書き方
– ハッシュには3通りの書き方があるが「省略形」が一般的。
– 「nil」 = なにもないの意
– Rubyでの繰り返し処理は「each文」を使う
– Each文内の変数名は、配列の変数名の単数形にすることが(慣習上)多い。
[Rails] RSpec エラー expected `User.count` to have changed by 1, but was not given a block
はじめに
Rails のテストツール Rspec を使ってみました。
使用中に、expected `User.count` to have changed by 1, but was not given a block と言うエラーにハマったので備忘録として残します。問題のソースコード
これがエラーの出るソースコードです。
エラーのでるソース
“`ruby
expect(
find(‘input[name=”commit”]’).click
).to change{User.count}.by(1)
“`エラーの内容
エラー expected `User.count` to have changed by 1, but was not given a block
翻訳 `User.count`が1変更されると予想されましたが、ブロックが与えられませんでしたchange マッチャを使うときは、expectをブロックにしなきゃいけないよって事
RailsにおけるURLの直打ちを阻止する方法
# きっかけ
viewファイルに条件分岐を作っていても、そもそもUrlから直打ちされてしまうとページに飛ばれてしまうことに気づいたため。# 結論
任意のコントローラーにbefore_actionを使って、アクションを起こす前段階の条件分岐を作っておく。# コード
“`ruby:items.controller.rb
class ItemsController < ApplicationController #before_actionを使って、コントーラーのアクションに飛ぶ前に条件分岐をかける before_action :correct_user, only: [:edit] before_action :item_find, only: [:show, :edit, :update, :destroy] def edit end private def item_params params.require(:item).permit(:title, :explain, :category_id, :condition_id,
Ransackでor検索機能を作る。
## 使用環境
“`
rails 6.0.2
ubuntu (WSL)
“`## 手順
### gemインストール
“`Gemfile
gem ‘ransack’
“`
`bundle`を忘れずに。### 内容の検索
`post_controller`は既に作ってあるものとします。“`posts_controller.rb
def index
unless params[:q].blank?
#入力された単語を空白で分割
split_keyword = params[:q][:content_cont].split(/\p{blank}/)
end
@q = Post.ransack(content_cont_any: split_keyword)
@posts = @q.result
end
“`
入力(検索ワード)があるか調べる。
ここがないとエラーになると思う。“`.rb
unless params[:q].blnak?
“`### 検索フォーム
“`posts/index.h
【Ruby】3桁の整数を取得しif文を使って条件分岐 ( digitsメソッド )
## 概要
[前回書いた記事](https://qiita.com/suzu12/items/d0b53838353d6a6e651e)で使用した **digitsメソッド** を使って3桁の整数を位ごとに分けて条件分岐をするという問題を解いてみました。前回とは少し視点が違うので理解を深めるのには良いと考え記事にさせていただきました。
## 目次
– 実践
– 問題
– 条件
– 解答– 補足
– 変数numの処理結果
– 変数sumの処理結果– まとめ
– 参考文献
## 実践
#### 問題
>3桁の整数があります。その整数の 「百の位・十の位・一の位の和」 を出力し、10の倍数との差を出力するプログラムを書いてください。
**条件**
– 10の倍数との差が 2 以内であれば`True`
– それ以外であれば `10の倍数との差は◯です`
– ただし、10の倍数との差が近い方を出力する。#### 解答
“`ruby
def near_ten_multiple(i)
num = i.digits
【Rails】ログイン結果をJSON形式で返す(初学者用)
## はじめに
API通信って最初何やってるのかよくわかりませんでした。
今回は、同じ悩みを持つ人が少しでもイメージが持てるように、
UIはつくらずに、実行後のレスポンス結果をJSONで返す実装を紹介します。
題材はRails初学者が恐らく最初に学んだであろうサインアップ、ログイン。## コード
※ userテーブルのカラムはemail,password
※ アクセスURLはhttp://localhost:3000/api/v1/*** とします。localhost:3000のままでもok“`ruby:routes.rb
Rails.application.routes.draw do
# namespaceで /api/v1/の階層をつくる
namespace :api, format: :json do
namespace :v1 do
post :sign_up, to: ‘users#sign_up’
post :login, to: ‘users#login’
end
end
end
“`“`rub
rubyとpythonのif文の書き方の違い
Progateでpythonの基本的な文法を勉強中なので、rubyとの違いをまとめておく。
##rubyのif文
・if〜endで囲む“`ruby
x = 100if x == 100
print “xは100です”
else
print “xは100じゃないです”
end
“`##pythonのif文
・条件式の最後に「:(コロン)」をつける
・実行する処理の記述はインデントする“`python
x = 100
if x == 100:
print(‘xは100です’)
else:
print(‘xは100じゃないです’)
“`pythonはインデントが動作に直接影響するから、自然と可読性が高いコードになりそうで良き
サーバーにruby、クライアントにPHPでgRPCを頑張る
##はじめに
google謹製のRPCフレームワークであるgRPCを使って、サーバーにruby、クライアントにPHPを使って、異なる言語間を共通のI/FでAPI通信してみたいと思います。異なる言語間としているのはgRPCのメリットであるIDL定義によるI/Fの共通化の醍醐味を味わってみたいというより、PHPでgRPCサーバの構築ができないという現実に対する条件反射のようなものですが、結果的に醍醐味もやってくるので、味わってみたいと思います。
クライアントにPHPを使う場合、サーバー側はどうもgoで紹介しているところが多いので、ここではrubyを使ってみます(はい、go知らないの確定)。
概要はここで書くまでもないので、さっそく。
ここではAPIとして、ドメインを指定すると有効期限を取ってくる、というものを書いてみます。INPUT: FQDN
OUTPUT: yyyy/mm/dd hh:ii:ssAPI(gRPC): 定義したI/Oで共通I/Fを用意
クライアント(PHP): サーバを通じてAPIにFQDNをリクエスト
サーバ(ruby): クライアントからリクエストされ
[Rails] [親子関係] 親を削除した時、子にある外部キーをnilで登録したい
## 概要
以下の親子関係をreferenceでリレーション構築している際、
親モデルのデータ削除時に、子である商品データは削除せずに外部キーがnilで登録されるようにしたいがコンソールから親を削除した際にエラーが出て対処方法がわからず少し困った話です。
・親モデル:”カテゴリー”
・子モデル:”商品”“`20201211121059_create_products.rb
t.references :category, null: false, foreign_key: true
“`## 実践
以下の記事などを参考に実施した。
optional: trueを設定すれば、nilを許可する方法
https://techtechmedia.com/optional-true-rails/#optional_true
https://qiita.com/takuyanin/items/6f6be86d1265be21bf9eこんな感じでhas_many, belongs_to にdependent, optionslのオプションを付けた。
“`catedory.rb
[Rails]seed作成でコンパクトに書きたい(%w記法、each_with_index、番号指定パラメータ)
seed登録にて、rubyの記法など使ったものを色々まとめてみました。
## 基本
“`rb
User.create!(name: ‘田中’, email: ‘tanaka@test.com’)
User.create!(name: ‘鈴木’, email: ‘suzuki@test.com’)
“`## 二次元配列
“`rb
array = [ [‘田中’, ‘tanaka@test.com’], [‘鈴木’, ‘suzuki@test.com’] ]
array.each do |first, second|
User.create!(name: first, email: second)
end
“`## 二次元配列(コンパクトに)
“`rb
[
[‘田中’, ‘tanaka@test.com’], [‘鈴木’, ‘suzuki@test.com’]
].each do |first, second|
User.create!(name: first, email: second)
end
“`## %w記法
“`rb
array = %
[Devise]Deviseのroutingカスタマイズ方法ざっくりまとめた
開発案件でdeviseのルーティングをカスタマイズをする機会が多かったのでざっくりまとめてみました。
まずdevise導入時に以下コマンド入力してルーティング設定しますよね。
“` :ターミナル
rails g devise user
“`
すると、以下のように自動でルーティングが設定されます。
これだけでdeviseルーティングが賄えるわけですが、カスタマイズしたい場合それの記述方法があります。“` rb
Rails.application.routes.draw do
devise_for :users
“`“`
new_user_session GET /users/sign_in(.:format) devise/sessions#new
user_session POST /users/sign_in(.:format) devise/sessions#create
destroy_user_session DELETE /users/sign_out(.:
devise使わずユーザー編集・更新機能を実装する
#はじめに
今回はユーザーのマイページを実装してから、プロフィールを編集できるようにするための方法を解説します。
#前提条件
・deviseを導入済み
・deviseによるゆーざー新規登録/ログイン機能を実装済み#開発環境
Ruby 2.6.5
Rails 6.0.0
MySQL 5.6.50#手順
##1)ユーザー詳細(マイページの実装)
まずdeviseのものとは別に`usersコントローラー`を作成します。
ターミナルにて以下コマンドを実行します。“`ruby:ターミナル
$ rails g controller users show
“`コントローラーが作成できたら、以下のようにファイルを編集ます。
“`ruby:controllers/users_controller
class UsersController < ApplicationController before_action :set_user, only: [:show] def show; end private def set_user @us
【Ruby on Rails】「||=」←この代入演算子の使い方まとめ
#代入演算子
`代入演算子`とは、変数に対して何か値を代入する為の演算子です。
以下記事にわかりやすく解説してあるので、わからない方は読んでみてください。https://wa3.i-3-i.info/word18049.html
`代入演算子`には以下のようなさまざまな種類が存在します。
|記号|意味|
|:-:|:-:|
|=|代入|
|+=|加算して代入|
|-=|減算して代入|
|*=|乗算して代入|
|/=|除算して代入|
|%=|乗余して代入|
|**=|累乗して代入|
|.=|文字列として結合(追加)|#「||=」(or equal)の代入演算子
代入演算子の中に、`「||=」`このような代入演算子も存在します。「=」と「||」が合体した演算子です。
`「=」`は代入を意味します。上でも記載したが代入演算子の一種です。
“`terminal:
a = b
a に b を代入します。
“`続いて、`「||」`はどちらかの条件が成立すれば、trueを返すという演算子です。(ORを意味します。)
これは、**論理演算子**と呼ばれています。`
deviseのlockableを使うときに意識しないといけないこと
## つまり
`config.unlock_strategy`を`:time`や`:none`にするときはよく考えて
## バージョン
* Rails 6.1.0
* devise 4.7.3## lockableについて
deviseのlockableは、ログインに何回か失敗したらアカウントロックを行う、というもの。
注意すべきは、「ログインがロックされる」のではなく、「アカウントがロックされる」のだということ。
これは、アカウントロック中にアクセスしたログイン中セッションは、全て強制ログアウトされる動作になる。これを利用して、次のようなイタズラをされると、結構困る。
1. ユーザAがdeviseを使ったwebサービスにログインしている
2. 他人がユーザAのメールアドレスでログインしようとするが連続で失敗して、ユーザAのアカウントロックされる
3. ユーザAがアカウントロック中にwebサービスにアクセスする
4. ログアウトされて、ユーザAはロック解除されるまでwebサービスが利用できなくなる### 回避方法
同回避するか、3つほど考えた。
#### メー