20220214のRailsに関する記事は13件です。

【Rails】rack-corsの設定方法

はじめに  本記事は、プログラミング初学者が、学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。  そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。  間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。 rack-corsの設定方法 config/initializers/cors.rb # Be sure to restart your server when you modify this file. # Avoid CORS issues when API is called from the frontend app. # Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests. # Read more: https://github.com/cyu/rack-cors Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do # 許可するオリジンを記述(APIを叩く側のドメインを記述)。 origins 'localhost:3000' # 許可するリソースファイルを記述 resource '*', headers: :any, # 許可するHTTPヘッダーを記述 # ヘッダー情報を外部に公開 expose: ["access-token", "expiry", "token-type", "uid", "client"], # 許可するメソッドを記述 methods: [:get, :post, :put, :patch, :delete, :options, :head] end end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsのscopeとは

scope(スコープ)とは 特定のSQL文をメソッドのように呼び出すことができる機能のことです。 下記のように、モデル内にscopeを定義することで使用することができます。 hoge_hoge.rb class HogeHoge < ApplicationRecord scope :active, -> { where(deleted: false) } scope :by_account, -> lambda{|account_id|where(account_id: account_id)} end # 使用例 HogeHoge.active HogeHoge.by_account(params[:account_id]) HogeHoge.by_account(params[:account_id]).active 何が便利なのか? ・コードが短くなる。 ・適切なscope名をつけることで、直感的に読みやすいコードになる。 ・何度も同じようなクエリを使いまわしている場合、  scopeを使用していれば、一箇所修正するだけで済む。 参考記事: https://pikawaka.com/rails/scope https://qiita.com/ozin/items/24d1b220a002004a6351 https://qiita.com/ngron/items/14a39ce62c9d30bf3ac3
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails heroku上のDBをリセットする

結論 heroku上のDBをリセットするには、以下のコマンドを実行する。 ターミナル. heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1 環境 rails 6.0.4.4 ruby 2.6.5 MySQL 5.6.51 heroku heroku runでDBリセットのコマンドを実行 heroku上のDBをリセットしようと以下のコマンドを実行した。 ターミナル. heroku run rails db:reset 以下のエラーが発生。 ターミナル. ActiveRecord::ProtectedEnvironmentError: You are attempting to run a destructive action against your 'production' database. If you are sure you want to continue, run the same command with the environment variable: DISABLE_DATABASE_ENVIRONMENT_CHECK=1 エラー内容をgoogle翻訳で訳すと以下のようになる。 ターミナル. ActiveRecord :: ProtectedEnvironmentError:「本番」データベースに対して破壊的なアクションを実行しようとしています。 続行することが確実な場合は、環境変数を使用して同じコマンドを実行します。 DISABLE_DATABASE_ENVIRONMENT_CHECK = 1 「データベースに対して破壊的なアクション」が実行されるので、本当に実行する場合は「DISABLE〜(以下省略)」を使用してください、ということらしい。 「DISABLE〜(以下省略)」を追記してコマンドを実行する。 ターミナル. heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1 heroku上のDBが予定通りにリセットされ、アプリの挙動も問題なし。 ローカル環境でDBをリセットした後に、本番環境のDBも忘れずにリセットする必要がある。 参考 https://qiita.com/yusuke_s221/items/cefb1808fdf481e6e445 https://qiita.com/saika_0/items/7afe389471adb4e69f9a
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

解決方法_Webpacker::Manifest::MissingEntryError

初めに 原因は細かに追求していません。(調べたけどわかりませんでした) あくまでも解決方法をまとめています。 エラー内容 Railsアプリを新規作成し、諸々初期設定を終え、いざbin/rails sしてブラウザで表示すると、下記のエラー文が表示。 エラー内容は、1.You〜に書いてある通り,webpackerの設定がコンパイルしないようになっていることが原因のよう。 javascript_pack_tagがレイズされてるのはなぜなのか、、。 webpackerでコンパイルしない設定になっているのに、JSをwebpackerでコンパイルする記述になっているから? Webpacker::Manifest::MissingEntryError Webpacker can't find application in /Users/"ユーザ名"/app/public/packs/manifest.json. Possible causes: 1. You want to set webpacker.yml value of compile to true for your environment unless you are using the webpack -w or the webpack-dev-server. 2. webpack has not yet re-run to reflect updates. 3. You have misconfigured Webpacker's config/webpacker.yml file. 4. Your webpack configuration is not creating a manifest. Your manifest contains: { } <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> 開発環境 ruby 2.6.5 rails 6.0.0 解決までの道筋 1. webpackerをインストールして、webpackerを用いたコンパイルを実行 ターミナルにて対象のRailsアプリのディレクトリで下記コマンドを実行 rails webpacker:install rails webpacker:compile しかし、解決せず。同様のエラーが発生。 2. Gemfileを書き換え gem 'webpacker', '~> 5.0’ に書き換え 3. package.jsonに"@rails/webpacker": "5.4.3"を追記 package.json "dependencies": { 略 "@rails/webpacker": "5.4.3" 4. yarn.lock削除 yarn installする前にyarn.lockを削除。 削除せずにyarn installすると、先ほどの変更が反映されないため。 (yarn.lockを元にyarn installされてしまう。) 5. yarn install と yarn add node-sass を実行 3.で行った変更を反映させる。 6. 再度コンパイル実行 rails webpacker:install rails webpacker:compile 7. 解決! webpackerでコンパイルできるようになりました。 終わりに 本エラーは2回再現されたため、メモとして残す。 せっかくなのでなぜこのエラーが発生するのかまで追求したかったのですが、分からず。 以下調べた内容をまとめる。 Rails6はデフォルトの設定だとSprocketsとWebpackerを併用することにより、アセットファイルのコンパイルを行っている。WebpackerはJavaScriptファイル、Sprocketsはその他のアセット(CSSや画像など)のコンパイル。 今回のエラーはWebpackerでのコンパイルが動作していなかった。 参考記事 https://qiita.com/negisys/items/2bf88659f584fe45b686 https://qiita.com/hryau6/items/820d0b404325688574ba
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【RSpec】なぜテストを書くのか?

伊藤さんのスライドの中で「テストの品質」についてこう書かれていた。 テストの役割 安全ネットとしての役割 実装の正しさを証明する役割 コードの品質を向上させる役割 省力化ツールとしての役割 バグを叩き潰す役割 設計を支援する役割 説明書としての役割 その中でも実際にテストを書いていて、特に実感したものを所感とともに挙げていく。 その1 バグを叩き潰す役割 バグが起きたときは修正する前にテストを書く。 修正しちゃんと実装されたらこう動くというテストを書いて落としておく →バグ改修 →実装が正しければテストがグリーンになる 上記の手順でバグ改修を行うことで、目視だけではなく実装として正しく修正されたことの証明にもなる。 (たまに書いたテスト自体が間違っていた場合もある…) その2 説明書としての役割 テストは仕様書にもなる。 過去の自分や他の人が書いたコードを読み解くとき、すでに走っているプロジェクトに途中で入って各機能を理解しなくてはいけないときなどにテストを読むことでだいたいを理解するのに役立った。 おわりに まだ独学で開発していた頃はテストを書いていなかったため、テストがあることでの安心感など分からなかったが、今となってはテストなしではいられなくなった。「テストなしでバグ改修とか無理!」とまでになった。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】 Webpacker::Manifest::MissingEntryError in

エラーの内容 Webpacker::Manifest::MissingEntryError in ooo#xxx 原因 webpackでコンパイルしていないことです。このため、webpackでコンパイルすれば解決します。 解決方法 $ rails webpacker:install 上記のコマンドで以下のログが出たら Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/ Exiting! 以下のコマンドをしてやる $ npm install --global yarn # installの確認 $ yarn --version $ rails webpacker:install 参考 https://prograshi.com/framework/rails/webpackermanifestmissingentryerror/ https://discuss.rubyonrails.org/t/i-cant-solved-webpacker-missingentryerror/79604
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

enumerizeのオプション・メソッドまとめ

enumerizeを使っておきながら便利なオプションやメソッドを活用しきれていなかったので、 備忘録も兼ねてメソッドとオプションをまとめました! 最もベーシックな使用方法 class User extend Enumerize enumerize :status, in: [:student, :employed, :retired] end これだけでモデルにinclusionバリデーションが追加されます(便利ぃ) ここから更に便利なオプションやメソッドを紹介します! 目次 skip_validationsオプション defaultオプション scopeオプション multipleオプション predicatesオプション _textメソッド valuesメソッド その他(enumerizeの値をカスタマイズする) Rspec オプション skip_validationsオプション デフォルトで追加されるバリデーションをskipする class User extend Enumerize enumerize :status, in: [:student, :employed, :retired], skip_validations: true end defaultオプション デフォルトの値を設定できる ActiveRecord::Enumでデフォルト値を設定する場合はDB側で設定する必要があるので、やっぱりenumerize優秀 class User extend Enumerize enumerize :status, in: [:student, :employed, :retired], default: :student end scopeオプション scope: :true scopeを生成し、with_やwithout_で絞り込みができるようになる class User < ActiveRecord::Base extend Enumerize enumerize :status, in: [:student, :employed, :retired], scope: true end User.with_status(:student) # SELECT "users".* FROM "users" WHERE "users"."status" IN ('student') User.without_status(:student) # SELECT "users".* FROM "users" WHERE "users"."status" NOT IN ('student') scope: :shallow enumerizeで宣言した値を直接メソッドのように使用し絞り込みができる class User < ActiveRecord::Base extend Enumerize enumerize :status, in: [:student, :employed, :retired], scope: :shallow end User.student # SELECT "users".* FROM "users" WHERE "users"."status" = 'student' 以下のmultipleオプションを使用している場合、scopeオプションは使用できま multipleオプション 配列のように複数の値を保有できる class User extend Enumerize enumerize :interests, in: [:student, :employed, :retired], multiple: true end user = User.new user.interests << :employed user.interests << :retired predicatesオプション booleanで判定できるようになる class User extend Enumerize enumerize :status, in: [:student, :employed, :retired], predicates: true end user = User.new user.student? # => false user.employed? # => false user.status = :student user.student? # => true user.employed? # => false predicatesオプションやscopeオプションはprefixで名付けすることも可能です メソッド 主にI18nのサポートをする為のメソッド *_text / .text I18nで定義している文言を取得する @user.status_text # or @user.status.text values enumerizeで定義している値を全て取得 User.status.values # or User.enumerized_attributes[:status].values # => ['student', 'employed', 'retired'] その他 enumerizeの値はintなどカスタマイズが可能です class User extend Enumerize enumerize :status, in: [:student => 1, :employed => 2, :retired => 3] end user = User.new user.status = :student user.status #=> 'student' user.status_value #=> 1 User.status.find_value(:student).value #=> 1 User.status.find_value(:employed).value #=> 2 Rspec 便利なマッチャを利用すればテストを簡単に書くことができます ベーシックなテスト class User extend Enumerize enumerize :status, in: [:student, :employed, :retired] end describe User do it { is_expected.to enumerize(:status) } end in 指定した値がenumerizeに定義されているかのテスト class User extend Enumerize enumerize :status, in: [:student, :employed, :retired] end describe User do it { should enumerize(:status).in(:student, :employed, :retired) } end with_default デフォルト値が設定されているかのテスト class User extend Enumerize enumerize :status, in: [:student, :employed, :retired], default: :student end describe User do it { should enumerize(:status).in(:student, :employed, :retired).with_default(:student) } end with_predicates predicatesオプションが適用されているかのテスト class User extend Enumerize enumerize :status, in: [:student, :employed, :retired], predicates: true end describe User do it { should enumerize(:status).in(:student, :employed, :retired).with_predicates(true) } end with_scope scope scopeオプションが適用されているかのテスト class User extend Enumerize enumerize :status, in: [:student, :employed, :retired], scope: true end describe User do it { should enumerize(:status).in(:student, :employed, :retired).with_scope(true) } end with_multiple multipleオプションが適用されているかのテスト class User extend Enumerize enumerize :status, in: [:student, :employed, :retired], multiple: true end describe User do it { should enumerize(:status).in(:student, :employed, :retired).with_multiple(true) } end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Webpacker::Manifest::MissingEntryErrorへの対処法まとめ

はじめに Webpacker::Manifest::MissingEntryErrorが発生した際の対処法です。 個人的的に大変頭を悩ませたエラーでしたのでこちらに備忘録を残していきます。 対象者 下記リンクの偉大な先人達の解決策でも解決できなかった方へ 現状発生している問題・エラーメッセージ あれは忘れもしませぬ、拙僧がRailsの教科書を行なっていた時のこと $ rails new helloworld $ rails g controller hello index $ rails s このように作成を行いサーバーを起動、ブラウザを使い作成したURLへアクセスすると下記のようなエラーが出た。 Webpacker::Manifest::MissingEntryError in Hello#index Showing /Users/damayan/my_web_apps/helloworld/app/views/layouts/application.html.erb where line #9 raised: Webpacker can't find application in /Users/damayan/my_web_apps/helloworld/public/packs/manifest.json. Possible causes: 1. You want to set webpacker.yml value of compile to true for your environment unless you are using the `webpack -w` or the webpack-dev-server. 2. webpack has not yet re-run to reflect updates. 3. You have misconfigured Webpacker's config/webpacker.yml file. 4. Your webpack configuration is not creating a manifest. Your manifest contains: { } Extracted source (around line #9): 7 8    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> 9    <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> 10  </head> 11 12   <body> 試したこと 知能と文化の破壊エンジンことGoogle先生の翻訳機能を使いエラー内容を確認 以下和訳 Hello#indexのWebpacker :: Manifest :: MissingEntryError 9行目で/Users/damayan/my_web_apps/helloworld/app/views/layouts/application.html.erbを表示しています。 Webpackerは/Users/damayan/my_web_apps/helloworld/public/packs/manifest.jsonでアプリケーションを見つけることができません。 考えられる原因: 1.ご使用の環境でcompileのwebpacker.yml値をtrueに設定します `webpack-w`またはwebpack-dev-serverを使用している場合を除きます。 2. webpackは、更新を反映するためにまだ再実行されていません。 3.Webpackerのconfig / webpacker.ymlファイルを誤って構成しました。 4.Webpack構成がマニフェストを作成していません。 マニフェストには次のものが含まれます。 {{ } エラー内容からwebpackerのコンパイルがうまくいってないかと思い、上記記載のリンクを参照し色々試すも解決せず、9行目の <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> をコメントアウトすればエラーが出ないことも確認したが根本的な解決にはならず途方に暮れる。 結論 node.jsのバージョン変更にて解決。 詳細 何かエラーがないかを確認。そうすると最初のrails new 実行時に e > urix@0.1.0: Please see https://github.com/lydell/urix#deprecated [2/4] ? Fetching packages... [3/4] ? Linking dependencies... [4/4] ? Building fresh packages... [-/3] ⠠ waiting... [-/3] ⠠ waiting... error /Users/damayan/my_web_apps/helloworld/node_modules/node-sass: Command failed. Exit code: 1 Command: node scripts/build.js ん? error /Users/damayan/my_web_apps/helloworld/node_modules/node-sass: Command failed. というエラーメッセージがあることに気づいた。もしやnode.jsのバージョンとwebpackの依存ライブラリの噛み合わせが原因で表示できないのではと思いnode.jsのバージョンを変更した。 node.js変更後に新しくrails new にて作成すると無事、作成したURLへアクセスすることが出来た! ※個人的にNode.jsのバージョンをv17.5.0からv14.0.0へ変更することで改善することが出来た。Node.jsのバージョン変更にて使用したものについては下記、参照URLの欄に記載しています。 おわりに いかがだったでしょうか。もしもお役に立てれば幸いです。 参照URL: 上記「対象者」項目にて記載させていただいた5つと下記を参照させていただきました。 ◆エラー内容について ◆node.jsのバージョン変更について
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】Postgresqlが突然エラーになった。

エラー内容 ActiveRecord::ConnectionNotEstablished (could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"? 結論、私の場合、下記で解決しました。 rm /usr/local/var/postgres/postmaster.pid 原因 PostgreSQLを停止すると削除されるが、macOSが正常に終了しなかった場合、プロセスID(PID)がのこったままで、エラーになる場合があるとのこと。確かにターミナルをちゃんと終了せずにMacを閉じた覚えがあります。 その他やったこと PostgreSQLの起動、停止、リスタート 上記をすると解決した記事をを見て、最初にやってみました。 ですが効果がなかったので、pidを削除しました。 削除してから起動、停止、リスタートを試すと、正常に起動した経緯です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ターミナルでRailsを起動するとPostgresqlが突然エラーになった。

エラー内容 ActiveRecord::ConnectionNotEstablished (could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"? 結論、私の場合、下記で解決しました。 rm /usr/local/var/postgres/postmaster.pid 原因 PostgreSQLを停止すると削除されるが、macOSが正常に終了しなかった場合、プロセスID(PID)がのこったままで、エラーになる場合があるとのこと。確かにターミナルをちゃんと終了せずにMacを閉じた覚えがあります。 その他やったこと PostgreSQLの起動、停止、リスタート 上記をすると解決した記事をを見て、最初にやってみました。 ですが効果がなかったので、pidを削除しました。 削除してから起動、停止、リスタートを試すと、正常に起動した経緯です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ターミナルでRailsを起動するとPostgreSQLが突然エラーになった。

エラー内容 ActiveRecord::ConnectionNotEstablished (could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/tmp/.s.PGSQL.5432"? 結論、私の場合、下記で解決しました。 postmaster.pidの削除。 rm /usr/local/var/postgres/postmaster.pid 原因 PostgreSQLを停止すると削除されるが、macOSが正常に終了しなかった場合、プロセスID(PID)が残ったままでエラーになる場合があるとのこと。確かにターミナルをちゃんと終了せずにMacを閉じた覚えがあります。 その他やったこと PostgreSQLの起動、停止、リスタート 上記をすると解決した記事をを見て、最初にやってみました。 ですが効果がなかったので、pidを削除しました。 削除してから起動、停止、リスタートを試すと、正常に起動した経緯です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【個人開発】Twitterで映える!ファンレターを交換・シェアして楽しめるサービス『ご縁箱』をリリースしました✧˖°。

はじめに... ▼ 皆さんはTwitterを使う上で このように感じたことはありませんか? 『 今ある ご縁を大切にしたい 』 『 フォロワーさんと感謝の気持ちを伝えたり、交流を深めたい! 』 『 あの人に話しかけてみたい! 』 けどきっかけがない..ちょっと億劫かも... こういった問題も楽しみながら解決出来る『 ご縁箱 』というサービスを開発しました。(Rails × Vue.js) ▼ ご縁箱を使うとどうなる? 実際に使ってみて... まだ話したことがなかったフォロワーさんと話すきっかけになった 色んなメッセージを頂いてほっこりした気分になった 自分の率直な気持ちをレターを送って伝えることで喜んでもらえた ご飯の約束ができた(全部焼き肉) 仲良しユーザーとの交流も深めることも出来ますが、まだ交流が出来ていないユーザーともコミュニケーションを取るきっかけにすることも出来るサービスです。 【今回作ったサービス】 https://goenbako.com 【私のご縁箱ページ】 https://goenbako.com/outputky スマホ・PC対応(※若干スマホ寄りのレイアウトです) サービスを作ったきっかけ 私は2021年の4月から10月初旬まで、オンラインのプログラミングスクール(RUNTEQ)で受講していました。 色んな方と交流を深めて刺激を受けたり、勉強会で新たな気付きを得た中で、 『そんな人達に普段は言わないようなことや感謝の気持ちを伝えたい!』 『一緒に楽しめて、その時の大事な気持ちを忘れないで残しておけるようなサービスを作ろう!!』 という想いでサービスを構想していきました。 ▼ 発想のタネ? 自分のmixiアカウントの紹介文を見たのがきっかけです。 mixiの紹介文は『 プロフィールに自分を紹介する書き込みをしてもらうことが出来る機能 』です。 ( いわゆる他己紹介 ) 現在、自分の周りは誰もINしていませんが紹介文一覧の不思議なアルバムのような空間がとても好きです。 人との繋がり、自身の感情の変化や当時から現在の軌跡が分かり、そこにとても価値を感じました。 Twitterの検索で 『mixi 紹介文』とワードサーチしたところ、同じように感じている方や、そういったサービスを求めている方が実際に多くいること知り、需要があることを確信しました。 この価値をTwitterというプラットフォームで表現・改良出来ないか?と考え、サービスのリリースに至っています。 サービス概要 ご縁箱はTwitter認証したユーザー同士でファンレターを交換・共有することが出来るSNS型のサービスであり、Twitter上で使えるコミュニケーションツールでもあります。 私は説明があまりお上手ではありません!!...百聞は一見に如かず。という言葉に頼って画像をよく使ってイメージをお伝えするという形を取らせていただきます。 認証しなくても一部の機能を楽しんでいただけますが、ここではTwitter認証してご縁箱を開設したことを前提とさせていただきます。 使い方 1. 自分のご縁箱ページをTwitterでシェア ツイート機能で共有するかプロフィールにリンクを載せることで、フォロワーさんに自分のページを共有します。 ▼ 例えば、これは私のご縁箱ページです。 https://goenbako.com/outputky Twitterでご縁箱ページを公開するか、このように公開している相手に対してレターを書くことでもSNSのようにご縁箱の中で繋がっていくことが出来ます。 2. レターを書く 交流したいユーザー、または応援している・気になるユーザーにレターを書くことが出来ます。 話題を自由に選ぶことができ、全て埋める必要もなく、入力した話題だけが送ったレターとして反映されます。 ただ漠然と 『 レターを書いてください! 』 と言われても書きづらくなる問題と 関係性問わず、誰でも負担少なく書けるように..という考えから、テーマを厳選しています。 ちなみに『ホーム』 ▶ 『送ったレター』から後で編集や削除も出来ます。 レターを書くのは楽しいです! 普段とは違った角度からその人のことを思い浮かべたり、その人の良い部分やポジティブな感情を届けるところがとても良いです。 つい真面目に書いてしまうのですが、適当にボケたりする風潮も好きです。 あなたのフォロワーさんがご縁箱を始めていたら是非、気軽に書いてみてください! 3. 受け取ったレターのシェア ( デザインOGP ) ※任意 受け取ったレターの項目を一つ選んでシェアすることが出来ます。 このタイミングでOGP画像を生成しているため遷移するまでに少しインターバルが発生します。 (具体的な処理内容については『 苦労した点 』で後述いたします) この間はユーザーに待たせることになるため、退屈に感じないように非同期処理で "移動しています..." というアナウンスを表示 & アニメーションを加えるようにしました。 受け取ったレターがデザインされたOGP画像となって反映されます。 Twitterでも気持ちの共有やリアクションをして話題を広げたり楽しむことが出来ます。 その他の機能紹介 レターの詳細 Twitter上でシェアされたツイートからアクセスすると ログインしていなくてもレターの全文を見たり、両者のユーザーページにも飛ぶことが出来ます。 シェアされたレターを通じてさらに第三者がファンレターを書くきっかけに少しでもなればいいなと思い、URL画像デザインとレター詳細ページのレイアウトも拘りました(^^) この一連の流れをユーザー同士で楽しみつつ、その過程で他のユーザーにも参加してもらい、ユーザーの縁が深まれば...というコンセプトです。 Twitterでフォロワーさんと交流を深めたい全ユーザーがご縁箱のターゲット層です!! ランダム訪問機能 ユーザーのページをワンタップでランダムにアクセスします。 新規のユーザーでも、ご縁箱の使われ方や世界観を感覚的に伝える目的と、 何か少し遊びを入れたいと思い実装しました。 単にユーザーのレコードをランダムに取得して画面遷移しているだけですが、意外と好評な機能です。 ユーザー検索機能 & 開設リクエスト機能 ユーザー検索機能はTwitterのIDにマッチするユーザーページに遷移します。 検索成功時の挙動(GIF画像) ▼ 検索失敗時は開設リクエストを案内 ユーザー検索でユーザーが存在しなかった場合、 『 見つかりませんでした。 』とただ表示されるだけだと、少し寂しくありませんか? (はい! 寂しいです!!) 検索したということはそのユーザーに対して興味やファンレターを書きたいという感情に近いものがあるはず.. その気持ちがなるべく無駄にならないように..なにか良い表現はないのか..?と考えた結果 検索ヒットしなかったユーザーにご縁箱をリプライで招待する機能を用意し、案内表示することにしました。 メール通知機能 ・ 設定ページ こちらはリリース後に要望/フィードバックを頂き、取り急ぎ実装いたしました。 RailsのActionMailerを使用しています。 実際に通知が来ると気持ち的に嬉しくなるので、実装して改めて良かったと思います(^^) 他にもプロフィール情報を更新したいという要望もいただき、リリース後に実装しました。 ひとまずは手動編集ではなく、twitter Gem を使って最新のクライアント情報を取得して更新するという仕様にしています。 実装について 使用技術 Ruby 2.7.4 Rails 6.0.4.1 JavaScript Vue.js 2.6.14 Gem sorcery carrierwave meta-tags twitter rubocop ライブラリ vuetify vue-router vuex vuex-persistedstate axios js-cookie vee-validate vue-gtag eslint その他 TwitterAPI heroku Amazon S3 ER図 細かめなこだわり ▼ 初心者ユーザーのみログイン時に、一度だけ使い方カードが表示される。 使い方がわかりづらいサービスのため、私のような感覚派かつ受動的なユーザーでも少しでも馴染みやすいように意識しました。 「受け取ったレターが0件の場合」という条件式と、Vuexで「1度表示したかどうか」のステートを保持させることで実現しています。 ▼ ログインしていなくてもレターを書くボタンを配置 ログインしていない場合はそもそもボタンを表示させないという実装が一番容易ではありましたが、導線を用意しておかないのは勿体ないと思い、ログインガイダンスを用意しました。 『登録する』『レターを書く』という明確な意志を持ったユーザーであれば別かもしれませんが、 ボタンすらない場合、興味本位で見に来てくれた新規ユーザーは本当に見るだけになってしまうのでは? 無意識でもファンレターを書くボタンを認識してもらうことには意味があると考え、このような設計にしました。 ハッシュタグを有効活用する 少しでもTwitterで認知していただきやすくするためにハッシュタグを一意でわかりやすいものにし、タグ一覧を見るだけでサービスの概要が掴めるようにしました。 Twitter単体で宣伝する際にも活用出来るものですので、最初にどう表現するかという部分まで慎重に決めました。 その他 全体的なレイアウト、デザイン(タイトルロゴ、ご縁箱イラストは例外) カラーやフォントで世界観を統一し、合わせて細かく素材を配置しました。 少しでもパフォーマンスの低下を抑えたかったため、Adobe Illustratorを使ってSVGのデザイン画像を自作しています。 デザインに関しては完全に素人でしたが、やってみたいと思い、試行錯誤を重ねつつ挑戦することにしました。 ログイン状態を保持しておく Twitterを行き来するサービスですのでvuex-persistedstateでログイン状態を保持するようにしました。 苦労した点 受け取ったレターをシェアする機能 デザインしたSVG画像をレターの内容をVueで反映させ、画像化した上でOGPに動的に反映させるという一連の処理の実装です。 この部分の実装です (Gif画像)画像のように文字を書き換えなくても画像はシェアはできますがツイート画面の状態で表示させるために書き換えています。 画像のように文字を書き換えなくても画像はシェアはできますがツイート画面の状態で表示させるために書き換えています。 SVG要素の扱い方、Canvas、フォントの適用やCSSの適用 OGP画像の仕組みやbase64画像をアップロードする方法 PC、スマホ、開発、本番 とそれぞれの環境下で所々動かないケース など、検証や問題の切り分けと根本的な知識の土台が必要となり、かなりの苦戦と時間を要しました。 具体的な処理の流れは以下のようになりました。 SVGの見えない部分の処理本番ではhiddenにしていますが2番までの処理は以下の画像のようになっています。 最初から表示してあるのが用意しておいたSVGのデザインフレームで、上に表示される画像がbase64画像化したものです。 画像のように文字を書き換えなくても画像はシェアはできますがツイート画面の状態で表示させるために書き換えています。 色々な記事を参考にしましたが、情報の掴み方が難しく、 一番の解決策はリファレンスなどを読み、土台となる知識を固めて挑むことでした。 初めて扱うオブジェクトや概念が多く、時間的な焦りや、厳しいと思うことが多々ありましたが、しっかり把握しながら実装すると着実に進めていけたため、とても楽しかったです。 終わりに 最後まで読んでいただき、ありがとうございました。 本記事もURL追記など改良していけたらと思いますので興味がある、良かったと思う方は是非ストックしていただいて、ご要望や感想などもコメントやTwitterで共有して頂けますと励みになります(^^) 良ければフォロワーさんに紹介していただいて、楽しんでください♪ https://goenbako.com
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ユニットテストのメソッドのメモ

メソッド 説明 assert(式 [, メッセージ]) 式が真ならば成功 assert_equal(変数1, 変数2 [, メッセージ]) 変数1と変数2が等しければ成功 assert_not_equal(変数1, 変数2 [, メッセージ]) 変数1と変数2が等しくなければ成功 assert_nil(変数 [, メッセージ]) 変数がnilならば成功 assert_not_nil(変数 [, メッセージ]) 変数がnilじゃなければ成功 assert_match(正規表現, 文字列 [, メッセージ]) 正規表現に文字列がマッチすれば成功 assert_no_match(正規表現, 文字列 [, メッセージ]) 正規表現に文字列がマッチしなければ成功 assert_raise(例外1, 例外2 [, 例外3…]) { } ブロックを実行して例外1,2が発生し、その例外がexpected_exception_klassクラスならば成功 assert_nothing_raised(例外1, 例外2 [, 例外3…]) { .. } ブロックを実行して例外1,2がおきなけらば成功 assert_in_delta(expected_float, actual_float, delta, message=””) flunk([メッセージ]) 常に失敗。未定義のテストケースなどを暫定的に失敗させたりする場合に利用 assert_difference(expressions, difference = 1, message = nil, 6block) ブロック実行後にecpressionsの値がdifferenceの分だけ変わっていれば成功 assert_no_difference(exoressions, message = nil, &block) ブロック実行前後でexpressionsの値が変わっていなければ成功 参照:ユニットテストで使うメソッド
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む