20211022のRubyに関する記事は15件です。

サービス設計について①!

①.結論! サービス設計とは、アプリ開発の際に事業戦略や構想の組み立てをし、「企画」から「設計」までする事です! それでは手順について説明します! ②.ペルソナ まずはペルソナを決めます! ペルソナとはマーケティングの用語で、「サービスを使用するユーザー」のことです! 似た言葉に「ターゲット」などがありますが、ペルソナはそれらよりも詳細に「サービスを使用するユーザー」を決めます! 年齢層、職業、性別、現在の境遇などまで決めることで、よりリアルに使用者の目線でサービスを考案できます! ③.ユーザーストーリー ユーザーストーリーとは、「ペルソナの課題に対して、どのような機能で解決していくのか」を明確にしたものです! 例えば、ペルソナの課題が「人気のグルメ情報をストックしたいけど、記事などを貯めておくと場所も取るし管理ができない」という課題だった場合、「人気のグルメの一覧を表示する」という機能がユーザーストーリーになります! ユーザーストーリーを確認して、要件定義に移ります! ④.要件定義 要件定義とは、開発者などがアプリケーションの仕様を把握するために、詳細まで言語化することです! ユーザーストーリーの段階では、人によってそれぞれの機能の「完成形のイメージ」が異なります! このままでは、数人で開発する場合に上手くいきません! したがって、開発に関わる人全員で共通認識を持つために、要件を定義していく必要があります! このようにして開発を進めていきます! ⑤.まとめ 各項目簡単に言うと! ペルソナとは、マーケティングの用語で、「サービスを使用するユーザー」のこと! ユーザーストーリーとは、「ペルソナの課題に対して、どのような機能で解決していくのか」を明確にしたもののこと! 要件定義とは、開発者などがアプリケーションの仕様を把握できるために、詳細まで言語化すること! こんな感じだと思います!開発の状況や仕様によって異なりますが、こんな感じの流れが大体です! しっかりと把握していきたいと思います! 何か説明で間違っていたらご指導お願い致します(_ _)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サービス設計について!

①.結論! サービス設計とは、アプリ開発の際に事業戦略や構想の組み立てをし、「企画」から「設計」までする事です! それでは手順について説明します! ②.ペルソナ まずはペルソナを決めます! ペルソナとはマーケティングの用語で、「サービスを使用するユーザー」のことです! 似た言葉に「ターゲット」などがありますが、ペルソナはそれらよりも詳細に「サービスを使用するユーザー」を決めます! 年齢層、職業、性別、現在の境遇などまで決めることで、よりリアルに使用者の目線でサービスを考案できます! ③.ユーザーストーリー ユーザーストーリーとは、「ペルソナの課題に対して、どのような機能で解決していくのか」を明確にしたものです! 例えば、ペルソナの課題が「人気のグルメ情報をストックしたいけど、記事などを貯めておくと場所も取るし管理ができない」という課題だった場合、「人気のグルメの一覧を表示する」という機能がユーザーストーリーになります! ユーザーストーリーを確認して、要件定義に移ります! ④.要件定義 要件定義とは、開発者などがアプリケーションの仕様を把握するために、詳細まで言語化することです! ユーザーストーリーの段階では、人によってそれぞれの機能の「完成形のイメージ」が異なります! このままでは、数人で開発する場合に上手くいきません! したがって、開発に関わる人全員で共通認識を持つために、要件を定義していく必要があります! このようにして開発を進めていきます! ⑤.まとめ 各項目簡単に言うと! ペルソナとは、マーケティングの用語で、「サービスを使用するユーザー」のこと! ユーザーストーリーとは、「ペルソナの課題に対して、どのような機能で解決していくのか」を明確にしたもののこと! 要件定義とは、開発者などがアプリケーションの仕様を把握できるために、詳細まで言語化すること! こんな感じだと思います!開発の状況や仕様によって異なりますが、こんな感じの流れが大体です! しっかりと把握していきたいと思います! 何か説明で間違っていたらご指導お願い致します(_ _)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]devise passwordの最低文字数を変更する

deviseのpasswordカラムは、デフォルトで最低文字数と最高文字数が設定されている -app/config/initializers/devise.rb devise.rb # 中略 # ==> Configuration for :validatable # Range for password length. config.password_length = 6..128 config.password_lengthの、 6 = 最低文字数 128 = 最高文字数 をそれぞれ表している よって、passwordの最低文字数、最高文字数を変更したい時は、上記数字を変更する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]アソシエーションしたActiveHashのモデルの、特定の要素を取得したい。

例:Itemモデルのfee_payer_idと紐付いた、FeePayerモデルのnameカラムの要素を取得したい。 立てた仮説 ItemモデルとFeePayerモデルはアソシエーションの記述を行っている。 →Itemモデルのインスタンス変数を使用して、ビューファイルに呼び出すことが可能なのでは? 添字は、Itemモデルのインスタンス変数から、fee_payer_idを指定して、代入する。 →指定した出品の画像を表示することが可能なはず。 <ul class='item-lists'> <% if @items != nil %> <% @items.each do |item| %> <li class='list'> <%= link_to "#" do %> <div class='item-img-content'> <%= image_tag item.image %> <%# 商品が売れていればsold outを表示しましょう %> <%#<div class='sold-out'> <span>Sold Out!!</span> </div> <%# //商品が売れていればsold outを表示しましょう %> </div> <div class='item-info'> <h3 class='item-name'> <%= item.name %> </h3> <div class='item-price'> <span><%= item.price %>円<br><%= item.fee_payer.name[item.fee_payer.id] %></span> 作業結果 いという、よくわからない文字が表示されただけだった。 作業結果がうまく行かなかった原因 eachメソッドをすでに実装しているにも関わらず、Itemモデルに紐付いたFeePayerモデルのnameカラムを特定しようとしていたから。 →出品されているもの1つずつに対して、値を取得するので、添字で特定する必要がない。 # [item.fee_payer.id]がいらない(eachメソッドですでにレコードは特定されている) <span><%= item.price %>円<br><%= item.fee_payer.name[item.fee_payer.id] %></span> 正しい記述方法 <span><%= item.price %>円<br><%= item.fee_payer.name %></span>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]正規表現まとめ

正規表現とは 文字列に特定の文字が含まれているかを確認することや、特定の文字を取り除くなどの操作を行うための技術。 さまざまな言語で同じようなコードで表すことができるように設計されている。 それによって、ほとんどの記述をRubyやJavaScriptなどの別言語間でも共有することができる。 表現方法 subメソッド 文字列の置換 第1引数に置き換えたい文字列を指定し、第2引数に変換後の文字列を指定します。 また、操作したい文字列は/で囲みます。 irb(main):001:0> str = "りんごを食べる" => "りんごを食べる" irb(main):002:0> str.sub(/りんご/,"みかん") => "みかんを食べる" 指定した文字列すべてを置換したい場合、gsubメソッドを使用する。 irb(main):001:0> tel = '090-1234-5678' => "090-1234-5678" irb(main):002:0> tel.sub(/-/,'') => "0901234-5678" # 最初のハイフンしか置換されない irb(main):003:0> tel.gsub(/-/,'') => "09012345678" matchメソッド 引数に指定した文字列がメソッドを使用した文字列に含まれているか否かをチェックする 含まれている場合は、指定した文字列がMatchDataというオブジェクトが戻り値で得られる。 含まれていない場合は、戻り値としてnilが得られる。 irb(main):001:0> str = "Hello, World" => "Hello, World" irb(main):002:0> str.match(/Hello/) => #<MatchData "Hello"> irb(main):003:0> str.match(/Good/) => nil マッチした文字列はまず、MatchDataという種類のオブジェクトで返されます。 MatchDataから実際にマッチした文字列などを取り出したい場合は、以下の様に配列から最初のデータを取り出す時と同様の形で取り出すことができます。 irb(main):001:0> str = "Hello, World" => "Hello, World" irb(main):002:0> md = str.match(/Hello/) => #<MatchData "Hello"> irb(main):003:0> md[0] => "Hello" 正規表現を使用したバリデーションの記述方法 [a-z] [ ]が、「角括弧に囲まれた文字のうち、いずれか1つがマッチする」を確認する。 -が、マッチする範囲を設定している。 → アルファベットのaからzのうち、いずれか1文字が含まれているというバリデーションになる。 irb(main):001:0> 'dog'.match(/[a-c]/) => nil \d dは「特殊文字」と呼ばれ、dは数字を表す特殊文字。 特殊文字を使用する場合、\を直前に記載するルールが有る。 → 数字が1つ含まれているというバリデーションになる。 irb(main):001:0> 'I have 3 pens'.match(/\d/) => #<MatchData "3"> {n ,m} 直前の文字が少なくてもn回、多くてもm回マッチすることを確認する。 irb(main):001:0> '12345678'.match(/\d{4,6}/) => #<MatchData "123456"> irb(main):002:0> '123'.match(/\d{4,6}/) => nil i 大文字、小文字を区別することなくマッチングを確認できる。 irb(main):003:0> 'Cat'.match(/cat/) => nil irb(main):004:0> 'Cat'.match(/cat/i) => #<MatchData "Cat"> . ハイフンやピリオドなど含めた全ての英数字において、どの1文字にもマッチします。 irb(main):001:0> 'hoge'.match(/./) => #<MatchData "h"> + 直前の文字が1回以上の繰り返しにマッチします。 irb(main):001:0> 'aaabb'.match(/a+/) => #<MatchData "aaa"> \A 直後に置いた文字を、文字列の先頭に持つ場合にマッチする。 \A\d{3} # 文字列の先頭に、少なくとも数字が3つ以上含まれているというバリデーション \z 直前に置いた文字を、文字列の末尾に持つ場合にマッチする。 \d{4}\z # 文字列の末尾に、少なくとも数字が4つ以上含まれているというバリデーション [ぁ-んァ-ヶ一-龥々ー] UFT-8のUnicodeにおいて、文字列全体が日本語で表記されている場合にマッチする。 irb(main):005:0> full_name = "yamadaハナ子" irb(main):006:0> full_name.match(/\A[ぁ-んァ-ヶ一-龥々ー]+\z/) => nil ?= 直後に設定した文字列でチェックを行い、設定した文字列を含む文字列にマッチする。 irb(main):001:0> name = "マイケルジョーダン" irb(main):002:0> name.match(/マイケル(?=ジョーダン)/) => #<MatchData "マイケル"> irb(main):003:0> name = "マイケルジャクソン" irb(main):004:0> name.match(/マイケル(?=ジョーダン)/) => nil *? チェックした文字列の中で、?の直後に設定した文字が出てきた場合、その段階で1文字目のみを返す。 ?=.*?[\d] # 改行以外のどの文字ともマッチする、数字1文字目を返す。 よくある記述 メールアドレスのバリデーション with_options presence: true do validates :email, format: {with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i, message: "is invalid. Input '@'." } end Rails:メールの正規表現を攻略する! - Qiita パスワードのバリデーション(半角英数字8文字以上) with_options presence: true do validates :email, format: {with: /[a-z\d]{8,}/i, message: "is invalid. Include both letters and numbers." } end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]sliceメソッド使い方まとめ

使い方 配列から指定された要素を戻り値として返す。 返し方 「インデックスを一つ 指定」して、該当部分の要素を切り出す方法。 「指定位置から指定の長さを指定」して、該当部分の要素を切り出す方法。 「範囲を指定」して、該当部分の要素を切り出す方法。 「インデックスを一つ 指定」して、該当部分の要素を切り出す方法 puts "ruby".slice(0) => "r" puts "ruby"[0] => "r" 「指定位置から指定の長さを指定」して、該当部分の要素を切り出す方法 # 原則、頭から指定位置を決める puts "ruby".slice(1, 2) => "ub" # 負の整数を指定位置にすると、末尾から指定位置を決められる puts "ruby".slice(-1, 1) => "y" 「範囲を指定」して、該当部分の要素を切り出す方法 puts "ruby".slice(2..3) => "by"
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]eachメソッド 配列が入れ子になっているときの処理方法

前提条件 果物の名前と値段が入った配列がある。 配列の中に、さらに同商品の値段の配列が含まれている。 fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]] やりたいこと この配列を用いて、果物の名前とそれぞれの合計額が出力されるようにしたい。 (出力) appleの合計金額は670円です orangeの合計金額は300円です melonの合計金額は2700円です 処理方法 fruits_price = [["apple", [200, 250, 220]], ["orange", [100, 120, 80]], ["melon", [1200, 1500]]] fruits_price.each do |fruit| sum = 0 fruit[1].each do |price| sum += price end puts "#{fruit[0]}の合計金額は#{sum}円です" end 考え方 eachメソッドを2回使用する。 fruits_price.each do |fruit| # まず、変数sumを定義 sum = 0 # fruit[1]=フルーツの名前に対して、ブロック変数priceを使用したeachメソッドを処理 fruit[1].each do |price| # priceを足した値をsumに再代入して、値段の配列に含まれる値を1つずつ足していく。 sum += price # = sum + price end # eachメソッドの中で出力することで、fruitの添字が1ずつ値が大きくなる。 puts "#{fruit[0]}の合計金額は#{sum}円です" end 結果、配列に含まれるフルーツ全てについて、名前と合計金額が出力される。 結論 まず1次配列についてeachメソッドを実施。 次に2次配列についてeachメソッドを実施し、2次配列の値をすべて取得。 最後に1次配列のeachメソッド内でputsメソッドを実施し、1次配列の値の数分、 2次配列の値をすべて取得しながら出力できる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者向けのRuby勉強会で使用した資料(繰り返し処理,繰り返し処理問題集)

繰り返し処理とは 同じ処理を何度も繰り返す処理のことです。 例えば 『〇〇回繰り返し行う』 『条件を満たしたら繰り返し処理をする』 eachで繰り返し処理 代表的なeachを使った処理を例にしていきます。 scores = [10,20,30,40,50,60] puts scores[0] + scores[1] + scores[2] + scores[3] + scores[4] + scores[5] #合計点は求められるし/5にすると平均点が出せますが   これだとめんどくさい汗 そこで繰り返し処理のeachを使います。 scores = [10,20,30,40,50,60] scores.each do |score| puts score end 実行すると 10 20 30 40 50 60 と出力されます。 これはscoresの中の数字です。 解説するとeachは日本語でそれぞれという意味です。 scoresの中の数字それぞれ取り出して、取り出した数字をscoreに入れる それをputsで出力させて上のようになります。 scores = [10,20,30,40,50,60] scores.each do |score| puts "Ruby" puts score end で出力するとどうなるか?   ここで質問 答えは Ruby 10 Ruby 20 Ruby 30 Ruby 40 Ruby 50 Ruby 60 解説すると、scoresをそれぞれ取り出します。 取り出すと同時にRubyも呼ばれます。 その後の処理も同じように繰り返します。 これでeachの処理の流れがわかるかと思います。 scoresの中の合計点を出すには scores = [10,20,30,40,50,60] sum = 0 scores.each do |score| sum = sum + score end puts sum でプログラムを実行すると、 210 になります。 ⚫︎補足 sumとscoreの変数名を変えても大丈夫です。 これはあくまで自分が何のプログラムかをわかりやすくしただけです。 eachとmapの違いは? eachと似たもので、mapというものがあります。 この2つの違いを説明します。 ⚫︎each 繰り返し処理を行う ⚫︎map 繰り返し処理の結果を配列にしたい時に使う 様々な繰り返し処理 each,map以外にもたくさんあります。 ex) while until loop select reject find times などです。 下の問題集でいろいろ調べながらやってみてください。 繰り返し処理問題集 問1ワンコを5回繰り返して出力させてください。 問2 変数gokuには goku = ["スーパーサイヤ人","スーパーサイヤ人2","スーパーサイヤ人3","スーパーサイヤ人ゴッド"] 上のように代入されています。 ~番目の変身は~です。となるように繰り返し処理を使って出力してください。 このように出力させてください。 # 1番目の変身はスーパーサイヤ人です。 # 2番目の変身はスーパーサイヤ人2です。 # 3番目の変身はスーパーサイヤ人3です。 # 4番目の変身はスーパーサイヤ人ゴッドです。 問3 難  変数numbersの中に数字が代入されています。 変数numbersの中から5で割れないものを出力させてください。 numbers = [10,17,25,30,46,78,100,112] 問4 難 問4 1から15までを1.5間隔で出力してください。 1 4  7 10 13が回答 問5 超難  下のコードを使って2021-08-27から2021-09-01を出力してください。 日付を一定間隔で作ってください。 t = Date.new(2021, 8, 27) end 2021-08-27 2021-08-28 2021-08-29 2021-08-30 2021-08-31 2021-09-01 と出力できればokです。 問6 number = [10,20,30,40,50] を足した合計を繰り返し処理を使って出力させてください。 繰り返し処理問題集解答 問1 5.times do puts "ワンコ" end #ポイント #繰り返し処理の回数指定がわかるかがポイントです。 問2 goku.each.with_index(1) do |goku, index| puts "#{index}番目の変身は#{goku}です。" end #ポイント each.with_indexが使えるかがポイント 問3 numbers = [10,17,25,30,46,78,100,112] result = numbers.reject do |n| n % 5 == 0 end p result 問4 1.step(7,1.5) do |x| puts x end #ポイント #stepが使えるかがポイントです。 #ちなみに3日間隔どと 1.step(15,3) do |x| puts x end 問5 require 'date' t = Date.new(2021, 8, 27) t.step(t + 5, 1) do |day| puts day end #ポイント #require 'date'を記述 #stepを使いこなせるか 問6 number = [10,20,30,40,50] sum = number.inject do |n,number| n + number end puts sum #ポイント #injectを調べられるかです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Javascript]ファイルを読み込まない

やりたいこと javascriptのファイルがビューファイルに読み込まれるようにしたい。 エラー内容 items/newがprofit.jsを読み込まない。 ## 調査 ERR_ABORTED=javascriptのファイルが正しいディレクトリに保管されていない。 GET [http://localhost:3000/items/profit.js](http://localhost:3000/items/profit.js) net::ERR_ABORTED 404 (Not Found) →下記の原因が考えられる。 items/newのscript属性の記載が誤っている。 application.jsの直下のディレクトリに配置していない。 ファイル名の記載が間違っている 発火するイベントの記載が間違っている ## 原因 profit.jsを読み込む記述を二重に行っていたため。 application.jsのDOMツリーに、require '../profit'と記述した時点で、自動で読み込まれるようになっている。 →すでに読み込まれているjsファイルを再び読み込もうとしているので、エラーになった。 app/javascript/application.js application.js require("@rails/ujs").start() // require("turbolinks").start() require("@rails/activestorage").start() require("channels") require("../profit"); app/views/items/new.html.erb hew.html.erb <div class="items-sell-contents"> <header class="items-sell-header"> <%= link_to image_tag('furima-logo-color.png' , size: '185x50'), "/" %> <script src="profit.js"></script> 解決策 new.html.erbのscript要素を削除する。 app/views/items/new.html.erb new.html.erb <div class="items-sell-contents"> <header class="items-sell-header"> <%= link_to image_tag('furima-logo-color.png' , size: '185x50'), "/" %> # 削除 <script src="profit.js"></script>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby] Rspec MySQLを読み込まない

やりたいこと Formオブジェクトの単一テストを成功させたい エラー内容 ActiveRecord::StatementInvalid: Mysql2::Error: MySQL client is not connected 調査 クライアントサイドからサーバーサイドにデータが送られていない。 原因 先に読み込まれるべきデータより前に、後のものを読み込んでしまってエラーが起きている可能性がある。 →処理が重すぎる。 解決策 処理ごとの待機時間を設ける。 処理はsleep(秒数)で定義する。 -app/spec/models/order_address_spec.rb order_address_spec.rb require 'rails_helper' RSpec.describe OrderAddress, type: :model do describe '購入情報の保存' do before do user = FactoryBot.create(:user) item = FactoryBot.create(:item) @order_address = FactoryBot.build(:order_address, user_id: user.id, item_id: item.id) sleep(1) end 参考 【Ruby On Rails】RSpecを用いたテストのエラー MySQL client is not connected - Qiita
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]deviseでログインできない

やりたいこと emailとpasswordを入力し、ログインを成功させたい エラー内容 正しくemailとpasswordを入力しているのに、Invalid email or password(メールアドレスかパスワードが異なる)と出てログインできない 調査 form_withメソッドで指定したカラムが間違っている? 例:パスワードを入れるform_withメソッドで、保存先をnicknameカラムで記述していた。 リクエストが失敗している 例:HTTPステータスコードが400代 devise_parameter_sanitizerメソッドで指定してバリデーションに誤りがある。 ストロングパラメーターの指定方法に誤りがある。 例:@を抜くように指定してしまった、passwordの英字が大文字に置換されてしまう ## 調査結果 form_withメソッドで指定したカラムが間違っている? →ビューファイルを確認したところ、カラムの指定は合っていた。 -app/views/devise/registrations/new.html.erb new.html.erb <%= render "shared/second-header"%> <%= form_with model: @user, url: user_registration_path, class: 'registration-main', local: true do |f| %> # 中略 <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">メールアドレス</label> <span class="indispensable">必須</span> </div> <%= f.email_field :email, class:"input-default", id:"email", placeholder:"PC・携帯どちらでも可", autofocus: true %> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">パスワード</label> <span class="indispensable">必須</span> </div> <%= f.password_field :password, class:"input-default", id:"password", placeholder:"6文字以上の半角英数字" %> <p class='info-text'>※英字と数字の両方を含めて設定してください</p> </div> <div class="form-group"> <div class='form-text-wrap'> <label class="form-text">パスワード(確認)</label> <span class="indispensable">必須</span> </div> <%= f.password_field :password_confirmation, class:"input-default", id:"password-confirmation", placeholder:"同じパスワードを入力して下さい" %> </div> # 以下略 <% end %> リクエストが失敗している →HTTPステータスコードは200だった →リクエストは正しくできている devise_parameter_sanitizerメソッドで指定してバリデーションに誤りがある。 →誤りはない。  誤りがあったら新規登録の時点でエラーが出るはず。 ストロングパラメーターの指定方法に誤りがある。 →誤りはない。  誤りがあったら新規登録の時点でエラーが出るはず。 ## 原因 sessions/newのform_withメソッドにUserモデルのパラメーターが渡されていなかったため。 →emailとpasswordを正しく入力したとしても、確認する値を持っていないので、何を入力してもエラーになってしまった。 ## 解決策 sessions/newのビューファイルのform_withメソッドに、Userモデルのインスタンス変数を追記。 →入力したパラメーターをUserモデルに渡して、確認することができるようになる。 -app/views/devise/sessions/new.html.erb new.html.erb <%= render "shared/second-header"%> <%= form_with model: @user, url: user_session_path, class: 'registration-main', local: true do |f| %> # @userを渡すことで、値を参照できるようになる。 # 以下略
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]サーバーが立ち上がらない

やりたいこと コードを修正したので、サーバーを再起動したい。 エラー内容 A server is already running. 調査 サーバーがすでに実行中のため、起こるエラー 原因 先に実行していたサーバーが切れていなかったため起こったエラー 解決策 pid番号(プログラム上で現在実行している処理を識別するための番号)を削除する プロセスIDとは - IT用語辞典 - tmp/pids/server.pid server.pid 91024 # これを削除したい ①現在実行中のpid番号を特定 lsof -i:3000 ②実行中のpid番号を削除 kill -9 'pid番号' 参考 rails serverを起動しようとすると "A server is already running."のエラーが表示されるときの対処法 - Qiita
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Herokuエラー】Failed to install gems via Bundler. 解決法

本記事は私自身の勉強のインプットとアウトプットを兼ねたものになりますので、分かりにくい点もあるかと思います。 間違っているところがありましたらコメントにて教えてください。 railsチュートリアル第1章のHerokuデプロイ時にエラーが起きたので、誰かの役に立てたらと思いこの記事を書くことにしました。 ローカル環境で学習を進めています。 筆者の環境 Macbook Air(M1, 2020) macOS Big Aur バージョン11.4 ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [arm64-darwin20] Rails 6.1.4.1 Bundler version 2.2.29 heroku/7.59.1 darwin-x64 node-v12.21.0 エラー① Total 6995 (delta 795), reused 0 (delta 0), pack-reused 0 remote: Compressing source files... done. remote: Building source: remote: remote: -----> Building on the Heroku-20 stack remote: -----> Determining which buildpack to use for this app remote: ! Warning: Multiple default buildpacks reported the ability to handle this app. The first buildpack in the list below will be used. remote: Detected buildpacks: Ruby,Node.js remote: See https://devcenter.heroku.com/articles/buildpacks#buildpack-detect-order remote: -----> Ruby app detected remote: -----> Installing bundler 2.2.21 remote: -----> Removing BUNDLED WITH version in the Gemfile.lock remote: -----> Compiling Ruby/Rails remote: -----> Using Ruby version: ruby-3.0.2 remote: -----> Installing dependencies using bundler 2.2.21 remote: Running: BUNDLE_WITHOUT='development:test' BUNDLE_PATH=vendor/bundle BUNDLE_BIN=vendor/bundle/bin BUNDLE_DEPLOYMENT=1 bundle install -j4 remote: Your bundle only supports platforms ["arm64-darwin-20"] but your local platform remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock remote: --add-platform x86_64-linux` and try again. remote: Bundler Output: Your bundle only supports platforms ["arm64-darwin-20"] but your local platform remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock remote: --add-platform x86_64-linux` and try again. remote: remote: ! remote: ! Failed to install gems via Bundler. remote: ! remote: ! Push rejected, failed to compile Ruby app. remote: remote: ! Push failed remote: Verifying deploy... remote: remote: ! Push rejected to XXX remote: To https://git.heroku.com/XXX ! [remote rejected] master -> master (pre-receive hook declined) error: failed to push some refs to XXX このように出てデプロイできませんでした。 内容をみると remote: Your bundle only supports platforms ["arm64-darwin-20"] but your local platform remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock remote: --add-platform x86_64-linux` and try again. remote: Bundler Output: Your bundle only supports platforms ["arm64-darwin-20"] but your local platform remote: is x86_64-linux. Add the current platform to the lockfile with `bundle lock remote: --add-platform x86_64-linux` and try again. Google翻訳 バンドルはプラットフォーム["arm64-darwin-20"]のみをサポートしますが、ローカルプラットフォームはx86_64-linuxです。 `bundle lock --add-platform x86_64-linux`を使用して現在のプラットフォームをロックファイルに追加し、再試行してください。 Bundlerの出力:バンドルはプラットフォーム["arm64-darwin-20"]のみをサポートしますが、ローカルプラットフォームはx86_64-linuxです。 `bundle lock --add-platform x86_64-linux`を使用して現在のプラットフォームをロックファイルに追加し、再試行してください。 とありました。 言われた通り実行してみます。 % bundle lock --add-platform x86_64-linux そして再度デプロイしてみる… しかし同じエラーが出ました。 さらに調べてみると こちらの記事を発見。 Bundlerのバージョンが2.1.xの時は開発環境がmacOS、デプロイ先のサーバーがLinuxでも設定なしでデプロイができたようですが、 2.2.x以降は設定が必要になるので先程のコマンドと % bundle lock --add-platform ruby を実行する必要があるそうでした。 Gemfile.lock PLATFORMS arm64-darwin-20 ruby x86_64-linux 追加されたか確認します。 エラー② 再度デプロイしてみます。 remote: ! at least twice. One common cause of this behavior is attempting to deploy code from a different branch. 次はこのようなエラーが出てきました。 Google翻訳 リモート:! 少なくとも2回。 この動作の一般的な原因の1つは、別のブランチからコードをデプロイしようとすることです。 このエラーの下にherokuサポートのURLが出てきましたのでそちらをクリックすると、 コミットされていないファイルがあるのにデプロイしようとしているためエラーが出ていたようです。 先程のエラーを解決するために実行したコマンドでGemfile.lockが新たに変更になっていました。 % git status でmasterブランチにいることと変更されたファイルがあることを確認。 % git add -A                                                    #変更された全てのファイルををadd % git commit -m "Update Gemfile.lock" #addしたファイルをコミット % git push #githubにプッシュ で変更されたファイルをコミットしてgithubにプッシュ。 そして再度デプロイ。 エラー③ 成功したようなのでデプロイしたアプリを開くと 何やらエラーっぽいので言われた通りのコマンドを実行してみました。 たくさんのログの中に code=H10 status=503 このような部分を発見。 H10 - App crashed (アプリがクラッシュしました) Web dyno のクラッシュや Web dyno でのブートタイムアウトにより、このエラーが表示されます。 とherokuのエラーコード一覧に書いてあったので検索。 % heroku run console を実行するとエラーが出てきて解決に繋がりそうなログが出てくると言うことを発見したので実行してみました。 Error loading the 'postgresql' Active Record adapter. Missing a gem it depends on? can't activate pg (~> 1.1), already activated pg-0.18.4. Make sure all dependencies are added to Gemfile. (LoadError) Google翻訳 'postgresql' ActiveRecordアダプターのロード中にエラーが発生しました。 依存する宝石がありませんか? pgをアクティブ化できません(〜> 1.1)、すでにpg-0.18.4がアクティブ化されています。 すべての依存関係がGemfileに追加されていることを確認してください。 (LoadError) pgのバージョンがあってないのか〜 と思い、RubyGems.orgでpgと検索。 (今まではgoogle検索で引っかかったRubyGems.orgのpg 0.18.4のコードをコピーしていました。) pg 1.2.3がヒット。 2021年10月現在ではこちらが最新バージョンでした。 めっちゃ前のやつをインストールしていました…情けない! Gemfile gem 'pg', '~> 1.2', '>= 1.2.3' と記述し直して、再度add→commit→push→デプロイ をし直すとデプロイ完了しました! 情けないミスでしたがバージョンの大切さが身に沁みたのでした。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者向けのRuby勉強会で使った資料 (変数と配列,配列問題集)

勉強会の状況 ・100人以上のプログラミング学習コミュニティで勉強会開催。 ・初学者の方向け ・集まったのは5~8人 工夫したこと  ・講義形式ではなく名指しで答えてもらう  理由は話しているだけだと眠くなってしまうため ・問題集を作成 あえて学んでない内容などを問題に出し調べながらやってもらう 調べて試行錯誤してもらうことを大切にした 大変だったこと ・間違ったことを教えられないというプレッシャー ・参加者に飽きさせない工夫が必要だった。 変数 変数とは 名前をつけて一時的に数字や文字などのデータを記憶しておく格納庫のようなものです。 例えば平均点のプログラムと言われて時間が経ったらわかりますか。 puts (60 + 40 + 30 + 70 + 40)/5 わかりづらいですよね。 でもこれならわかるはず。 japanese = 60 puts japanese #追加すると japanese = 60 english = 40 science = 30 history = 70 math = 40 #これならわかりやすい #これで平均点はわかります puts (60 + 40 + 30 + 70 + 40)/5 # これも平均点はわかります。 puts (japanese + english + science + history + math)/5 文字でもできます。 name = "のり" message = "エンジニアです。" puts name + "さんは"+ message 一度ラベル付けをすると何回も使いまわせます。 me = "僕" puts me + "は" + message 配列 簡単にいうとデータのかたまりのことです。 つまりデータをたくさん詰められる箱のような役割をしています。 そして、データ1つ1つは箱のようなもので、要素と呼んでいます。 例えば、それぞれ名前(文字列)を格納するようなイメージ*になります。 箱1つ1つには番号が振られていて、 この番号を添字と呼んでいます。添字は0から始まります。 #平均点を求めたい a = 50 b = 40 c = 30 d = 70 e = 80 f = 40 g = 90 h = 60 puts (a + b + c + d + e + f + g + h )/10 # ただこれだと何をやっているのかわかりづらいそこで配列を使います。 scores = [50,40,30,70,80,40,90,60] puts scores #添字注目 1番目と最後 puts scores[-] #文字でも同じ names = ["ルフィ","ゾロ", "悟空","ベジータ","炭治郎"] puts names[-1] 配列の追加 更新 削除 # scores = [10,20,30,40,50] #追加 scores.push(20) #*rubyは()を省略してもok print scores << 100 #更新 scores[1] = 10 # => [10, 10, 30, 40, 50, 20] #削除 scores.delete_at(2)    #*3つ目の要素を削除 # => [10, 20, 40, 50] #他にも # push pop shift unshift # insert # size count length # uniq # compact # reverse # sort sort_by 配列問題集 問1 ライオンとワニを最後を追加してください. ただしputsは使わない。 おまけ ライオンとワニを先頭に追加してください。 animal = ["犬","猫","鳥","象","猿"] 問2 trueの数を出力してください。 number = [10,20,30,40,50,true,false,nil,true,nil,false] 問3 やや難問 下の数字の小数点を切り上げて出力させてください。 a = 5.4 問4 下のコードを変えずに name = "SOCCER" name = name.downcase puts name SOCCER SOCCER と出力されるように変えてください。メソッドは1回しか使いません 問5 下の呼吸をランダムに出力させてください hashira = ["水の呼吸","炎の呼吸","風の呼吸","岩の呼吸"] 問6 配列の2番目から8番目の要素を出力させてください number = [3,5,6,8,40,20,1,5,7,6,3,9]  問7 難 スーパーサイヤ人と出力させてください。 animal = "サイヤ人" animal.prepend("スーパー") puts animal  問8 やや難 下のレベルの最大値と最小値を1つのメソッドで出力させてください level = [5,60,80,100,90,30] puts level.minmax 問9 先頭から1番目から3番目の要素を捨てて配列を出力させてください。 ただし[..]を使わないこと score = [10,20,30,40,50,60]  問10 難 下の配列を変えずに40と50を最後に追加してください。 ただしpushは使わないこと p [10,20,30]. 配列問題集解答 問1 animal = ["犬","猫","鳥","象","猿"] print animal.push "猿","ワニ" print animal.unshift "猿", "ワニ" #ポイント #答えあ1つではないことがポイントです。 #puts 以外が使えるかポイントです。 問2 number = [10,20,30,40,50,true,false,nil,true,nil,false] puts number.count(true) #ポイント #lengthやsizeと混同しないことがポイント 問3 やや難問 a = 5.4 puts a.ceil #ポイント #Ruby 四捨五入で検索するのがポイント #やりたいことを言語化できるかがポイント *補足  floor少数点きりすて  少数点ceil 切り上げ round 四捨五入 このサイトがURLです。 https://uxmilk.jp/43388 問4  name = "soccer" puts name.upcase! puts name #ポイント #upcaseと downcaseの理解ができているかどうか #!は破壊的メソッドでnameの中のものを大文字に書き換えてしまう。 問5 下の呼吸をランダムに出力させてください hashira = ["水の呼吸","炎の呼吸","風の呼吸","岩の呼吸"] kimetsu = hashira.sample puts kimetsu #ポイント #Ruby ランダムで言語化できるかがポイント URL https://www.sejuku.net/blog/72965 問6 number = [3,5,6,8,40,20,1,5,7,6,3,9] print number[3..9] 問7 doragonball = "サイヤ人" doragonball.prepend("スーパー") puts doragonball #ポイント #初学者にとってマニアックなのでメソッドを調べて試行錯誤できるかが重要 問8 level = [5,60,80,100,90,30] puts level.minmax 問9 score = [10,20,30,40,50,60] puts score.drop(3) #ポイント # 先頭の 要素を捨てて、残りの要素を出力 問10 p [10,20,30].concat([40,50]) # 文字列や配列同士を結合できます。 # 文字列オブジェクト.concat(連結する文字列オブジェクト) # 配列オブジェクト.concat(連結する配列オブジェクト)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】class << selfとは

class << selfとは 特異クラス定義式のこと。 クラスメソッドはクラスインスタンスに属する特異メソッドですが、上記の形式でのクラスメソッドの定義は「<<」の後ろにクラスインスタンスを指定し、その「クラスインスタンスの特異クラスを定義している」とみることができる。 https://www.school.ctc-g.co.jp/columns/nakagoshi/nakagoshi12.html クラスメソッドを定義するときに全てのクラスメソッドにself.をつけるのが手間なときに特異クラスを使うと便利。 foo.rb class Foo < ApplicationRecord class << self def bar puts 'bar' end end end foo.rb class Foo < ApplicationRecord def self.bar puts 'bar' end end 上2つのコードは同じ意味になる。 参考 より詳しい特異クラスと特異メソッドの説明は下記参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む