- 0.1. 6 Railsを用いた注文機能の作成方法
- 0.2. 1 Railsでエンドユーザーのサインアップとログイン機能、管理者のログイン機能を実装
- 0.3. $ rails generate devise:install 実行後の4つのセットアップ
- 0.4. chrubyの使い方
- 0.5. Ruby unlessとは
- 0.6. Ruby技術者認定試験 3.1 Silver受験した
- 0.7. Ruby モジュールとは
- 0.8. Ruby nilってnullと違うの?
- 0.9. 【Rails】bundle install Your Ruby version is 3.0.2, but your Gemfile specified 3.0.4の対処法
- 1. 症状
- 2. 解決策
- 3. 参考
- 3.1. 6-3. オリジナル開発初期手引書
- 3.2. アクティブストレージを利用して複数枚の画像を投稿した際の単体テスト
- 3.3. エラーメッセージを日本語対応にする
- 3.4. ブロック、コールバックの使い方の一例
- 3.5. [Ruby]関数を作成する上で心がけること
- 3.6. 【Rails6】終了日のバリデーションはValidatorが使える
- 3.7. 【エラー解決方法(Rails API)】 406 Not Acceptable,…is missing a template for this request format and variant
- 3.8. Action Cable+ReactでWebSocketのアプリケーションを0から作る
- 3.9. 久々にRubyでスクレイピングをしてみよう
- 3.10. Rubyで参照渡しができなくても悲観する必要はなかった
- 3.11. 画像投稿機能を改善する(プレビュー機能をつけよう)
6 Railsを用いた注文機能の作成方法
# 注文機能の流れ
###### 1 注文情報を入力
###### 2 注文情報を確認
###### 3 注文機能
###### 4 注文完了画面# 前提条件
## orderモデル , order_detailモデル , カラム,アソシエーションをこのように定義しましたorder.rb
“`Ruby
class Order < ApplicationRecord belongs_to :end_user has_many :order_details #enumによって、数字に意味を持たせることができる #今回の場合、0がcredit_card 1がtransferという意味。 #支払い方法 enum payment_method: {credit_card: 0, transfer: 1} #注文ステータス enum order_status: {wait_payment: 0, confirm_payment: 1, making: 2, preparing_ship: 3, finish_prepare: 4} end ``
1 Railsでエンドユーザーのサインアップとログイン機能、管理者のログイン機能を実装
## 1 Deviseの導入
#### (1)Gemfileに以下を追記する“`
gem ‘devise’
“`
#### (2) bundle intallを実行する## 2 顧客 , 管理者用のモデルを作成する
顧客のモデルを作成する
“`
rails g model devise Enduser
“`管理者用のモデルを作成する
“`
rails g model Admin
“`## 3 顧客 , 管理者用のテーブルを作成する
それぞれのマイグレーションファイルに以下を追記するdevise_create_end_users.rb
“`Ruby
t.string :first_name 名前 姓
t.string :katakana_first_name 名前 カナ 姓
t.string :last_name 名前 名
t.string :katakana_last_name 名前 カナ 名
t.string :postal_code 郵便番号
t.string :a
$ rails generate devise:install 実行後の4つのセットアップ
<開発環境>
・cloud9
・Rails:5.2.8.1
・Ruby : 2.6.3<きっかけ>
自主制作アプリにログイン機能を追加しようと
gemに’devise’を追記した後、4つのセットアップをした時のやり方。まずはgemfileに以下を追記。
“`
gem ‘devise’
“`
そしてターミナルで下記を実行する。
“`
$ rails generate devise:install
“`正常に実行されれば4つのセットアップの文が表示される。
ですが今回はエラーはないものの、正常にインストールしていなかったので
普段やるはずの以下の4つのセットアップ項目を追記していく。1つ目
アプリ名/config/environments/development.rb に下記を追記。
“`
config.action_mailer.default_url_options = { host: ‘localhost’, port: 3000 }
“`
2つ目
アプリ名/config/routes.rb に追記。
“`
root to:
chrubyの使い方
## chrubyのインストール
“`
ghq get postmodern/chruby
“`その後
“`bash
source “${HOME}/src/github.com/postmodern/chruby/share/chruby/chruby.sh”
source “${HOME}/src/github.com/postmodern/chruby/share/chruby/auto.sh”
“`を ~/.zshrc.local とかに追加 (2つ目は.ruby-version用)
## ruby-installのインストール
“`
ghq get postmodern/ruby-install
“`その後
“`bash
export PATH=”${PATH}:${HOME}/src/github.com/postmodern/ruby-install/bin”
“`を ~/.zshrc.local とかに追加
## Rubyのインストール
“`
ruby-install 3.1.2
“`## Rubyの一覧
“`
ch
Ruby unlessとは
PHPerがRuby on Railsを学んでいく中の備忘録
## unlessとは
unless文は、条件が「偽」の場合にその後の処理を実行するもの。## unlessの文法
“`unless.rb
unless 条件式 [then]
#条件式が偽の時に実行する処理
end
“`## unlessでelseは使える?
unlessでもelseを使うことができる
“`unless_example.rb
unless 条件式 [then]
#条件式が偽の時に実行する処理
else
#条件式が真の時に実行する処理
end
“`## 注意
可読性における観点から、ifで事足りる場合には、unlessでelseが使われることはほぼない。## 返り値
条件式の評価結果が偽である場合は評価結果を返し、条件式が真である場合は式が、nilを返す## 後置unless(unless修飾子)
3項演算子のように一行で記述することが可能
“`unless.rb
式 unless 式
“`
後置unlessは、右辺の条件が成立しない場合に、左辺の指揮を評価し、その
Ruby技術者認定試験 3.1 Silver受験した
試験のrubyバージョンが2020年10月から2から3に変わったのですが、
対策本が出ていなかったり、ネットの情報がないため受験するか迷っていました。
ただ、再受験無料キャンペーンがあるっぽいので、落ちた時のショックも少ないかなと思い受験しました。結果としては、version2の問題などで学習しても問題なかったです。
学習の際、整理した内容を記載します。## 使用した問題集
– [公式問題集 Ver3.0](https://github.com/ruby-association/prep-test/blob/version3/silver_ja.md) [(解答)](https://github.com/ruby-association/prep-test/blob/version3/silver_answers_ja.md)
– [公式問題集 Ver2.0](https://gist.github.com/sean2121/945035ef2341f0c39bf40762cd8531e0) [(解答)]()
– [ミニツク](http://www.minituku.net
Ruby モジュールとは
PHPerがRuby on Railsを書くことになったので、備忘録として
PHPをやってきて、モジュールという概念を知らなかったので## モジュールの書き方
“`module.rb
module モジュール名
処理
end
“`
モジュール名は必ず英数字の大文字で始める## モジュールとクラスの違い
・モジュールはインスタンスを作れない
・モジュールは継承できない## モジュールを使う目的
・名前空間の提供
・インスタンスメソッドとして取り込む(Mix-in)
・モジュールをオブジェクトに取り込む(extend)
・モジュール関数## モジュールを使った名前空間の提供
Ruby on Railsのコードを見ていて、この使い方が一番多いのかなという印象
PHPでいうところの名前空間(namespace)と同じ使われ方呼び出しは ::演算子を使い、モジュール名::モジュール名 またはモジュール名::クラス名 のように使う
## インスタンスメソッドとして取り込む(Mix-in)
PHPでいうところのtrait?
Rubyは多重継承を許さず、Mix-inとい
Ruby nilってnullと違うの?
元々PHPをやっていて、Rubyのnilというものが気になったのでメモ
## nilとは
Rubyでは「null」ではなく「nil」が利用されるRubyは全てがオブジェクトなので、nilは、NilClassに属している。
nilはNilClassの中の唯一のインスタンス。nil判定を行う際は、NilClassの中の定義されたメソッドを使用する必要がある。
→ こちらの件についての追記
nil? メソッドは確かに NilClassクラスに定義されていますが,Objectクラスにも定義されていて,どんなオブジェクトに対しても使えます。
でないと nil 以外のオブジェクトに対して NoMethodError が出て nil 判定できませんからね。
Object クラスの nil? メソッドは常に false を返しますが,NilClass クラスの nil? メソッドはそれを「常に true を返す」メソッドとして上書きしています。@scivolaさん、ご指摘ありがとうございました!
## nilの判定
### nil?
nil?では、対象オブジェクトがnilかどうかを確
【Rails】bundle install Your Ruby version is 3.0.2, but your Gemfile specified 3.0.4の対処法
症状
DockerでGemfileのrubyバージョンを変更した後、ローカルでサーバーを実行したとき、下記のエラーが発生しました
Gemfileのバージョンが違うと怒られているようです。
ただ、Docker側でバージョンが3.0.4で使っているので、できればGemfileのバージョンを変えたくない・・・。“`terminal:error
Your Ruby version is 3.0.2, but your Gemfile specified 3.0.4
“`“`ruby:Gemfile
ruby ‘3.0.4’
“`“`ruby:Gemfile.lock
RUBY VERSION
ruby 3.0.4p107
“`解決策
以下のサイトにアクセスして、ローカル環境に該当のバージョンのrubyを入れて、解決しました。
https://rubyinstaller.org/downloads/
参考
https://rubyinstaller.org/downloads/
6-3. オリジナル開発初期手引書
## 0. はじめに
企画面談お疲れ様でした!早速オリジナル開発を進めていきましょう!
このページは、オリジナル開発の第一歩を踏み出すときに使用します。
(“`rails new“`から削除機能まで)まず、自分の企画面談シートを開いておきます。
このページでは、企画面談サンプルシートを使って説明していきます!
# 目次
1.railsアプリケーションの作成 & 開発の下準備
2.モデルの作成
3.ルーティングの作成
4.コントローラーの作成
5.新規投稿機能
6.一覧ページの表示
7.ログイン機能の作成(任意)
8.開発を便利にしてくれるツールの紹介## 1. Railsアプリケーションの作成 & 開発の下準備
アクティブストレージを利用して複数枚の画像を投稿した際の単体テスト
アクティブストレージを利用して複数枚の画像投稿には成功した。
しかしテストコードで詰まったので記録。
結論
“`ruby
RSpec.describe Item, type: :model do
before do
@item = FactoryBot.build(:item)
@item.images = [ fixture_file_upload(“/files/test_image.jpg”)]
end
“`
このように書き換える。
画像1枚のときは fixture_file_uploadだけでよかったのですが、複数枚になったことで配列で渡す必要があったのですね。
エラーメッセージを日本語対応にする
フリマアプリ追加実装にてエラーメッセージを日本語対応にしたので記録。
まずは
config/application.rb
“`ruby
config.i18n.default_locale = :ja
“`
を追記。これしないとエラーでます。“`ruby
gem ‘rails-i18n’
“`
をgemファイル末尾に加えてbundle install(ローカル)
itemモデルのimageのところを
“`ruby
has_many_attached :images
“`
このようにhas_many_attachedに変える。image→imagesの複数形にすることも注意。
次にitemsコントローラー。
ストロングパラメーターを書き換える。
“`ruby
def item_params
params.require(:item).permit(:product_name,:product_description,:category_id,:condition_id,:contribution_id,:prefecture_id,:delivery_id,
ブロック、コールバックの使い方の一例
>どうもaono1234と申します。記事がいいなと思ったらtwitterのフォローもお待ちしております‼
Tweets by takeshi_program皆さん、ブロック(コールバックメソッド)は使用されてますでしょうか?
自分は今日まで使ったことがありませんでした。?どうも使いどころが分からないんですよね~
しかし、やっと使いどころが1つ明らかになりましたので共有させて頂きます。## はじめに
本記事は以下の読者様が対象です。
* プログラミング初心者
* コールバックメソッド(ブロック)について知りたい
本記事ではRubyを題材に例題コードを作成しているため、コールバックではなくブロックと呼称させて頂きます。
## 先に結論
* ブロックを使うことで複数のメソッドをつなぎ合わせることができる。
* メソッドを拡張する際によりブロックを使えば、抽象的な名前に変更しなくてよくなる。## 背景
私はオリジナルのスクレイピングコードを書いており、
以下のような自作メソッドを定義しておりました。このメソッドはスクレイ
[Ruby]関数を作成する上で心がけること
## ラベル付き引数
* 引数名がはっきりしているので渡す内容がわかりやすい。
* rubymineのIDEなどで自動保管してくれる
* 渡し忘れの引数があればエラーが出る
* デフォルト値も指定できるのでデフォルト値指定した分は省力できる
* 引数の順番気にしなくていい“`
# 定義
def some_method(user: , require: false)
end# 呼び出し型
some_method(
user: current_user
)
some_method(
user: current_user,
require: true
)
“`## 普通の引数
* rubymineのIDEなどで引数名は把握できる
* 渡し忘れの引数があればエラーが出る
* デフォルト値も指定できるのでデフォルト値指定した分は省力できる
* 引数の順番を気にしなくてはいけないので数が多いと面倒
* 1・2個の引数でメソッド名からもわかりやすければ楽
* User.find(1) / User.find_by(id: 1) 左が楽“`
def
【Rails6】終了日のバリデーションはValidatorが使える
## 環境
Rails 6.0.1
Ruby 2.6.3
PostgreSQL 11.16## 状況
終了日が開始日より先にならないようにバリデーションをかけたい。
開始日は必須パラメータで、終了日はオプション。## before
“`ruby
class Period
attr_reader :start_date, :end_datedef initialize(start_date, end_date)
@start_date = start_date
@end_date = end_date
enddef validate_finish_contract_date!
return nil if end_date.blank?raise ActionController::BadRequest, ‘不正な終了日です’ if end_date.to_date < start_date.to_date end_date.to_date end end ``` ## after 別クラスに切り出さな
【エラー解決方法(Rails API)】 406 Not Acceptable,…is missing a template for this request format and variant
# 概要
Rails7とReactでjbuilderを使用して値を返した際に出力された406エラーを解決するための記事です。### エラー内容
“` docker
api_1 | Completed 406 Not Acceptable in 24ms (ActiveRecord: 5.6ms | Allocations: 1086)
api_1 |
api_1 |
api_1 |
api_1 | ActionController::UnknownFormat (Api::V1::PostsController#index is missing a template for this request format and variant.
api_1 |
api_1 | request.formats: [“text/html”]
api_1 | request.variant: []):
api_1 |
“`
### ソースコード
“`posts_controller.rb
module Api
modu
Action Cable+ReactでWebSocketのアプリケーションを0から作る
RailsのAction CableとReactの組み合わせでWebSocketのアプリケーションを0から作ってローカルで動作させました。
この記事では下記のチャットアプリの作った手順を紹介します。
下記の動画では、上下のブラウザでwebsocketでチャットしています。![ezgif-1-7afa5d7957.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/83424/43644227-8722-339f-9a7b-c99478de698f.gif)
# 主要ライブラリなどのバージョン
フロントエンドはReact、バックエンドはRailsを使っています。
主要なライブラリのバージョンは下記の通り。## バックエンド
| ライブラリ | バージョン |
|:———–|:———–:|
| Ruby | 3.1.2 |
| Rails | 7.0.4 |
| Redis | 7.0.5 |
| Re
久々にRubyでスクレイピングをしてみよう
## 概要
一時期呼吸するようにスクレイピングをしていたのですが、最近しておらず職場で少々それ関係の話題になったのであらためてここに簡単なものを残しておこうと思う。## 環境
ruby 3.1.2## 準備
rubyなのでGemfileを定義します。Gemfile
“`ruby
source ‘https://rubygems.org’gem ‘nokogiri’
“`
HTMLのパースのためにnokogiriを使うのでこれだけ用意します。
ほかは標準で入っているものでjsonのパースとかしてくれる(強い)作業ディレクトリで下記のコマンドを実行
“`sh
bundle install –path .bundle
“`
ただのbundle installだとグローバルに入っちゃったりするので、パス指定しておくほうがおすすめです。## 実装
では、結論から
“`ruby
require ‘net/http’
require ‘uri’
require ‘nokogiri’
require ‘kconv’
require ‘json’
require ‘
Rubyで参照渡しができなくても悲観する必要はなかった
## 環境
Ruby2.6## はじめに
自分が以前使っていたVBでは、関数での引数の受け渡しには、デフォルトではByValが指定されており、値渡しが基本であった。しかし、引数のパラメータに、ByRefを設定することで、参照渡しができるようになっていた。しかし、Rubyではどうも、参照渡しがそもそもできない仕様になっている。「うーん、これができないのか、使えんなー。」という印象であったが、Rubyには参照渡しができない代わりに、戻り値が複数選択できるようになっていた。思い直した。「なるほど、これはいいかも知れない。」このような仕様になっているのであれば、引数による参照渡しは確かに不要であった。戻り値を複数選択した場合、どのような動きになるのか、確認してみた。## 動作確認
普通に、戻り値を1つだけ指定する場合です。戻り値でよく使われる、Boolean型を戻り値にしています。メソッド内の処理が正常終了したか、異常終了したか(更新処理で失敗して例外に飛んだなど)を判断するときによく使われるかと思います。
“`test.rb
def test_return?(a)
if
画像投稿機能を改善する(プレビュー機能をつけよう)
完成した某フリマアプリに画像投稿機能の改善をしました。
プレビュー機能と、実際に見た時に画像のサイズがバラバラだったので、画像サイズを統一できるように設定しました。
“`javascript
document.addEventListener(‘DOMContentLoaded’, function(){const itemForm = document.getElementById(‘new_item’);
const previewList = document.getElementById(‘previews’);
if (!itemForm) return null;
const fileField = document.querySelector(‘input[type=”file”][name=”item[image]”]’);
fileField.addEventListener(‘change’, function(e){
const alreadyPreview = document.querySelector(‘