Rails

実践で学ぶオブジェクト指向⑤ テスト実践編(Rspec)

前回学んだことを踏まえてRspecで各モデルのテストを書きました。 Gameモデルのspecを最後に書いたんですが、1つのメソッドで副作用がたくさん起こるのでテストが書きづらかった。 「テストを書くのに苦労するとき、アプリケーションの設計がマズい可能性が…

実践で学ぶオブジェクト指向④ 効果的なテストを行う

今回はテストについて考えたいと思います。 『オブジェクト指向設計 実践ガイド』の9章の部分です。 なぜテストを書くのか 変更可能なコードを書くための3つのスキル オブジェクト指向設計への理解 リファクタリングの能力 リファクタリングとは「ソフトウェ…

実践で学ぶオブジェクト指向③ メソッドの粒度

メソッドを小さく分ける 前回のコードには問題が残っています。Judgeが本来の責任に加え、処理分岐の知識を持ってしまっていることです。 これは良くないので、分岐に関する知識をGame_Masterに戻しましょう。以下のようになります。 def open(card_id) if c…

実践で学ぶオブジェクト指向② if分岐のネスト/デメテルの法則

繰り返されるif分岐 今回はまず、GameMasterクラスのopenメソッドについて考えてみようと思います。 このメソッドはアプリケーションの中で一番行数が多く、まず着手すべき部分であることは自分でもすぐに分かりました。 以下が現状のコードです。

実践で学ぶオブジェクト指向① 神経衰弱ゲームを設計する

「理解していない」という事実を分かってなかった…… 自分が今までオブジェクト指向設計を全く考慮せず、不安定なrubyの知識の上でMVCを理解しないままアプリケーションを積み上げていた、という衝撃の事実を先週知りました。 「コントローラーに処理を全部書…

create→ROLLBACKの原因を知りたい

Herokuにデプロイしたあと、UserのCreateがロールバックされてしまい、その理由がログに出ないので困り果てていました。 def create @user = User.new(user_params) @user.save! end save!で例外を発生させるようにすると、ログにエラー内容が出るようになり…

Vue.js + Vuex + Railsでツイッター風のSPAを作った

やりたかった事は ・Vue.jsの基本的な操作おさらい ・RailsはAPIのみに専念させる ・郵便番号から住所を取得するメソッド ・ユーザーに何かしらの数値を持たせて管理する

Rails + Nokogiri + Vue.jsでスクレイピング & SPAを作った

Rails + Nokogiri + Vue.jsを使ってシングルページアプリケーションを作りました。 史上5頭目の三冠牝馬アーモンドアイの競走成績表を作成してチェックできるアプリケーションです。 ネット競馬.comをスクレイピングしたデータをもとにRailsのモデルオブジェ…

json.jbuilderでオブジェクトの配列を渡す、他

v-forディレクティブのなかでv-on:click="メソッド()"の引数に配列の要素を渡す 特別な書き方は必要なく、そのまま書ける。

モーダルウィンドウを使うときのHTML構成

モーダル表示中はモーダル外を暗くしてその暗い部分をクリックしたときにモーダルが閉じるようにする。 やり方はこんな感じ イメージ

Railsの処理が失敗した時に失敗JSONを返すことでVue.jsの処理を分岐させる

非遷移でVue.jsとRailsがやり取りするにあたって、失敗時の処理を分岐させる方法です。 以下のような形で実装しました。 ①Rails内の処理が成功したか失敗したかを、それぞれ別のJSONを返すことで判定 ②Vue.jsでは、返ってきたJSONによって成否を判断して処理…

データ削除後の表示を非遷移で更新する

シングルページアプリケーションなのでデータの削除時も非遷移で表示が変更されなければいけません。 しかし、Vueのメソッド内で ・axiosでdeleteリクエストを送信 ・データ取得メソッドを実行 とそのまま記述しても ①axiosでdeleteリクエストを送信 ②データ…

axios.POSTした配列オブジェクトをRailsのモデルオブジェクトとして保存する

1つのレースオブジェクト { name: 桜花賞, location: 阪神, weather: 晴 } 複数のレコードオブジェクト(配列) [ { name: 馬A, jockey: 騎手A }, { name: 馬B, jockey: 騎手B }, ...... ] これらを同時にVue.jsから投げ、Railsで取得してそれぞれのモデル…

Heroku上で画像の読み込みが非常に遅い

Herokuに自作アプリケーションをデプロイしたものの、どうも最初にアクセスするときに時間がかかりタイムアウトのエラー(H12)が出る。 開発環境ではスッとアクセスできる。 とりあえずHerokuのログを見てみる。 INFO -- : [3b31ed68-8e79-4c34-b04b-d2c8d08a…

PostgreSQLではINTEGER型のカラムをorderでソートするときNULLが先頭に来てしまう

またしてもデータベースの違いでつまづきました。 とりあえずこれですべて片付いたとは思うけど、今度から開発環境と本番環境で同じDBを使おうと心に誓いました……。 現象 記事(article)にいいね数(likes_count)カラムがあり、その数値でソートして人気記事ラ…

PostgreSQLではstrftimeを使えない。困った

20日間ほどかけて取り組んできたブログサービスをHerokuにデプロイしたところ以下のエラーが。 ActiveRecord::StatementInvalid (PG::UndefinedFunction: ERROR: function strftime(unknown, timestamp without time zone) does not exist LINE 1: SELECT CO…

Railsにいいね機能を実装する

Railsアプリにいいね機能を実装しました。 作っているのがブログサービスなのでArticleにいいね(Like)をする形になってますが、ツイッター風アプリケーションであればArticleはTweetに置き換えて読んでください。 前提 Rails : 5.2.1 ツイッターのふぁぼ(…

Railsで異なるモデルも作成・編集できるフォームを作る

Rails: 5.2.1 fields_forを使うとひとつのフォームから複数のモデルを作成・編集することができます。 モデルの構成は、Blog has_one Category 上記はBlogモデルの編集フォームですが、入力欄3つ目の「ブログのカテゴリー」を入力して変更ボタンを押すとCate…

Railsでブログアプリに月別アーカイブを導入

作成中のブログアプリケーションに月別アーカイブの機能を実装しました。 こんな感じのやつです。 前提 Rails: 5.2.1 リレーションは User has_one Blog, Blog has_many Articles です。 はじめにメソッドを用意 まずブログ記事の :created_at を元に月別に…

Bootstrap4でwill_painateを使ってページネーション

ブログの記事一覧にページネーションを導入しようと、Railsチュートリアルの10章を参考にやってみたけどBootstrapがうまく反映されず。 調べてみたらBootstrap4だと少し違う方法になるようなので、まとめました。 前提 Rails: 5.2.1 Bootstrap4: 4.1.3 (今回…

FactoryBotメモ

『Everyday Rails - RSpecによるRailsテスト入門』を読んでRSpecを使い始めました。 以下メモ ファクトリ ↓spec/factories/users.rb FactoryBot.define do factory :user do name "マイク" text "こんにちわです" sequence(:email) { |n| "tester#{n}0@examp…

RailsアプリにシンプルなWYSIWYGエディタを導入

Basecampが開発しているWYSIWYGエディタ、TrixをRailsに導入しました。 Railsプロジェクトは作成中のブログサービスアプリケーション。 ブログ記事の作成ページにエディタを導入します。 バージョン Rails 5.2.1 Trix 0.10.1 インストール まずgemを導入しま…

ranked-modelを使うときは :with_sameオプションを付けよう

前置き 自作中のTODOアプリではタスクの表示順を自由に入れ替えできるようになっています。 indexページには User の Task 一覧を表示 表示の順番はranked-model gemを使って :row_order の値で制御 それぞれの Task はjQueryUIのsortableを導入してドラッグ…

テンプレート側で出力する値の処理を行うのは避ける

表示に必要なデータはプログラム側で用意し、 テンプレートではデータを埋め込む場所や表示方法などを記述する。 前置き 「そのタスクがいくつのサブタスクを保持しているか」をindex画面に表示しています。 この部分のコードが以下です。 <td><%= task.subtasks</td>…

繰り返されるインスタンス変数の初期化をメソッドに切り出す

前置き 作成中のTODOアプリでは、ユーザーがタスクを複数所有し、それぞれのタスクがサブタスクを複数所有しています。 アクションメソッド(数個だけ抜粋) def show @user = User.find(params[:user_id]) @task = Task.find(params[:task_id]) @subtask = …

入力したテキストの改行をviewに反映する方法

このように、テキストの改行が反映されるようになります。 simple_formatメソッドを使う このメソッドは与えられた文字列に対して 文字列を<p>で括る 改行は<br/>を付ける 連続した改行は</p><p>に変換 という処理を行います。 ただ、HTMLタグなどをサニタイズする働きもあ</p>…

テキスト内のURLがaタグに変換されるようにする

目的 タスク管理アプリのタスクの説明部分にリンクを追加できるようにしたい。 つまり、text_areaなどで入力したテキストを表示する際にURLを含んでいたら自動的にリンクを作るようにしたい、ということです。 helperメソッドを作成 URIライブラリを使います…

「オブジェクト指向でなぜつくるのか」を読んだ

オブジェクト指向に対する誤解が解けた プログラミング言語は、機械語によるプログラミングからアセンブリ言語→高級言語→構造化言語というように、「より便利に」を目指してそれぞれの課題を解決するように進化してきました。 なかでも「無駄を省く」「保守…

ネストしたリソースのユーザー制御

完成したタスク管理アプリに、「ひとつのタスク内にサブタスクを作成できる機能」をアップデートで追加しました。 Subtaskモデルを作成したので、現在ルーティングはこうなっています。 Rails.application.routes.draw do get 'static_pages/home' root to: …

Herokuへのデプロイ時に苦労した話

昨日完成したTodoアプリをHerokuにアップしました! その際2箇所でつまづいたので、記録しておきます。 pg gemがインストールできない HerokuではSQLiteがサポートされていないのでPostgreSQLを使います。 sqlite3 gemをproduction環境で使わないように、 そ…