- 投稿日:2022-02-23T22:49:43+09:00
テスト
H1 これはH1タグ H2 これはH2タグ H3 これはH3タグ H4 これはH4タグ H3 これはH3タグ H2 これはH2タグ H1 これはH1タグ H2 これはH2タグ
- 投稿日:2022-02-23T22:10:16+09:00
Ruby の rescue の注意点
今更ながら Ruby技術者認定試験のGOLD を受けようと思い 模擬試験問題を解いていたところ...奇妙なコードに出くわした。 忘れると痛い目を見そうなので、ここに記述する begin 'aaa'.bbbb rescue puts "レスキュー出来たね" end #=> レスキュー出来たね 何も問題はない begin 'aaa'.bbbb rescue NoMethodError puts "レスキュー出来たね" end #=> レスキュー出来たね これも問題ない 期待通りの動きである begin 'aaa'.bbbb rescue NameError puts "レスキュー出来たね" end #=> レスキュー出来たね むむ? エラーの種類が違うのでは? begin 'aaa'.bbbb rescue StandardError puts "ここには来ないよね?" rescue NoMethodError puts "レスキュー出来たね" end #=> ここには来ないよね? 来てしまったのである 原因を追うと... NoMethodError の親クラス = NameError NameError の親クラス = StandardError という事みたい。 トラップだな。気をつけないとね。
- 投稿日:2022-02-23T19:26:09+09:00
bundle exec rspec実行時にSelenium::WebDriver::Chrome#driver_path= is deprecated.〜 エラーが発生した
bundle exec rspec実行時のエラー解決備忘録 エラー内容 RSpecでテストを実行使用とした際に、下記エラーが発生した。 $ bundle exec rspec2022-02-23 18:27:19 WARN Selenium [DEPRECATION] Selenium::WebDriver::Chrome#driver_path= is deprecated. Use Selenium::WebDriver::Chrome::Service#driver_path= instead. 解決方法 Gemfileの記載内容を修正 gem 'chromedriver-helper' を削除 gem 'webdrivers' を追加し、bundle installを実行 再度bundle rspec test を実行し、無事テストが走った group :test do # Adds support for Capybara system testing and selenium driver gem 'capybara', '>= 2.15' gem 'selenium-webdriver' gem 'webdrivers' end 所感 そもそも、WebDriverとは何かを知らなかったため、今回のエラーで新たな知識を得られる良い機会だったなと実感した。。。 参考
- 投稿日:2022-02-23T17:06:01+09:00
Ruby returnで複数の値を返す
はじめに 学習記録アプリの開発中、グラフの作成のために1週間分の日付の取得する処理を、「今週」「最後に学習した日の週」「最後に学習した日の前週」の3つそれぞれ記載していました。Rubyでは、メソッドの戻り値を複数返すことができるということなので、3つの処理を1つにまとめていきたいと思います。 環境 rails 6.0.4.4 ruby 2.6.5 chart.js 2.8.0 複数の戻り値を返し方 returnの後にカンマで区切って返す値を記述します。 def calc(a, b) x = a + b y = a - b return x, y end a = 20 b = 15 x_1, y_1 = calc(a, b) puts x_1, y_1 このように、x_1とy_1の変数にそれぞれ値が入っています。 ターミナル. 35 5 ちなみに1つの変数に対して、複数の戻り値を代入すると、自動的に配列に変換されます。 正確には、データそのものが配列形式で入るのではなく、データの場所の情報が入り、配列と同じ記述で取り出せるようです。 現在の状況 今週分の日付を取得(週初めの日付、週終わりの日付、1週間分の日付、1週間分の日付のJSON形式、の4つを定義しています) textbook_controller.rb @b_date = Date.today.beginning_of_week @e_date = Date.today.end_of_week week_date = week_date_calc(@b_date, @e_date) @week_date = week_date.to_json.html_safe 最後に学習した日を含む週の日付を取得 textbook_controller.rb @tb_date = @max_date.beginning_of_week @te_date = @max_date.end_of_week week_date = week_date_calc(@tb_date, @te_date) @week_date = week_date.to_json.html_safe 上記週の1週間前の日付を取得 textbook_controller.rb @lb_date = @max_date.prev_week @le_date = @max_date.prev_week(:sunday) week_date = week_date_calc(@lb_date, @le_date) @week_date_l = week_date.to_json.html_safe 補足 @max_dateは学習記録テーブルで日付の最大値を代入しています。 week_date_calcメソッドは週初めと週終わりの日付を渡して、その間の日付をもつ配列を作成します。 textbook_controller.rb def week_date_calc(b_date, e_date) w_date = [] s_date = b_date while s_date <= e_date w_date << s_date s_date += 1 end w_date end メソッドを作成 日付を1つ渡して、週初めの日付、週終わりの日付、1週間分の日付、1週間分の日付のJSON形式、の4つのデータを返すメソッドを作成します。 textbook_controller.rb def week_date_set(search_date) b_date = search_date.beginning_of_week e_date = search_date.end_of_week week_date = week_date_calc(b_date, e_date) week_date_json = week_date.to_json.html_safe return b_date, e_date, week_date, week_date_json end 上記、メソッドを使用してコードを書き直していきます。 今週分の日付を取得 textbook_controller.rb @b_date, @e_date, week_date, @week_date = week_date_set(Date.today) 最後に学習した日を含む週の日付を取得 textbook_controller.rb @tb_date, @te_date, week_date, @week_date = week_date_set(@max_date) 上記週の1週間前の日付を取得 textbook_controller.rb @lb_date, @le_date, week_date, @week_date_l = week_date_set(@max_date.weeks_ago(1)) prev_weekメソッドでは前週の週初めを取得してしますので、weeks_agoメソッドに変更しました。 おわりに これでコードを直す前と同じ動作をするようになりました。 なお、終わった後に気づきましたが、週初めと週終わりの日付は、メソッドで作成した配列から取得すればよかったので、個別で作成する必要はなかったですね。なので、4つの戻り値を返していますが、実際は2つでよかったです。 参照 関数で複数の返り値を返す/関数の引数は値渡し ― コーディングミスを防ぐには?(2
- 投稿日:2022-02-23T16:25:12+09:00
【解決方法1】We're sorry, but something went wrong. If you are the application owner check the logs for more information.
【事象】 RailsTutorial第6版の7章。 herokuへのデプロイ後に本番環境を確認したところ、なぜか/signupへのリンクで下記エラーが発生。 「We're sorry, but something went wrong. If you are the application owner check the logs for more information. 」 開発環境では問題なく作動しているが本番環境の/signupへのリンクで何か問題が起きていることが発覚。 【やったこと】 下記コマンドでログを確認したところ、status=500の赤いテキストを発見。 heroku logs --tail 500エラーとはサーバーのエラーとなり、heroku側のエラー。 本番環境でマイグレーションしていないことに気づき、下記コマンドを実行。解決。 heroku run rails db:migrate
- 投稿日:2022-02-23T00:09:23+09:00
外部キーのテストコードが上手くいかない
簡易的なフリマアプリを作成中。 単体テストコードにて、エラーが発生。 下記ターミナル内のエラー内容。 ターミナル Failures: 1) OrderDelivery 購入者情報の保存 内容に問題がある場合 userが紐ついていなければ購入できない Failure/Error: expect(@order_delivery.errors.full_messages).to include( "" ) expected [] to include "" # ./spec/models/order_delivery_spec.rb:81:in `block (4 levels) in <top (required)>' 2) OrderDelivery 購入者情報の保存 内容に問題がある場合 itemが紐ついていなければ購入できない Failure/Error: expect(@order_delivery.errors.full_messages).to include( "Item must exist" ) expected [] to include "Item must exist" # ./spec/models/order_delivery_spec.rb:86:in `block (4 levels) in <top (required)>' order_deliveryモデルとuserモデル、itemモデルをそれぞれ外部キーとして設定しているが、なぜか紐ついていない様子。 (ローカルサーバーでは上手くいっているのに・・・) expected [] to include 上記のエラー文は過去にも見たことがある。その時はバリデーションで記述したエラーメッセージと、テストコードで記述したエラーメッセージの内容が異なっていた事が原因だった。 ("can't be blank" を "can't be blanc" とスペルミスしたことでエラーになった) 今までも他のアプリで外部キーのテストコードは何回もしたが、バリデーションにエラーメッセージを記述した覚えはない。 google先生に聞いてみても、期待する回答は返ってこなかった。 もしかしたら、変数が間違っている? 何度もコードを読み返すが、間違っている様子もない。 そんな時、ふと思い付く。 「あれ?そういえばimageも外部キーやでな?」 models/item.rb のコードを見ると、確かにアソシエーションの記述がある。 しかもその下にはバリデーションの記述まである。 物は試しで該当のコードに追記してみる。 models/order_delivery.rb class OrderDelivery include ActiveModel::Model attr_accessor :token attr_accessor :post_code, :address_id, :municipalities, :house_number, :building, :tel, :order_id, :user_id, :item_id with_options presence: true do validates :user_id # 追記 validates :item_id # 追記 validates :token validates :post_code, format: {with: /\A[0-9]{3}-[0-9]{4}\z/, message: "input correctly"} validates :municipalities # 以下省略 成功!! でもなんで? しっかりとカリキュラムに書いていました。 Formオブジェクトで実装したクラスはアソシエーションを定義することはできないため、バリデーションを行う事ができません。そのため、use_idに対してバリデーションを新たに設定します。 エラー解決に2時間かかりました・・・ 失敗は今しかできないと前向きに捉えて、明日からまた学習に励みます!