20210913のRailsに関する記事は17件です。

初心者がGemについて解釈する!

初めて聞いた時、何のことかさっぱりわからなかったです。。。 そもそもGemとは?初心者なりにわかりやすく噛み砕いていこうと思います! Gemとは? 結論は、GemはRubyのライブラリと言うことです! RubyGemsにはたくさんのライブラリがあり、それぞれをGemと呼ぶ。 ライブラリとは? 結論は、他のプログラムと組み合わせて使用する為に、複雑なプログラムを1つのセットにしたもの! プログラミングにおける拡張機能は、ライブラリと呼ばれ、複雑な機能実装でも、ライブラリをアプリへ読み込ませることにより、簡単に実装できるようになる!と言うことですね! まとめ わかりやすく言うと、良いパーツを使って簡単に実装していくって事だと思います! 言語化して説明するの本当に難しいです汗 間違っていたりしたら、遠慮なくご指導してください(; ;) とりあえず慣れるまで、今後もこんな感じで描いていこうと思います。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

kaminari gemってorderの位置で取得順変わるの?

RubyやRailsのページネーションの実装でよく使われるkaminari gem。 レビュワーから「orderの指定位置で中身の順番変わる可能性ある?」と指摘を受けて検証してみたので その結果のメモです。 どういうことかというと、次の2つって実行結果同じなの?という話。 Hoge.order('created_at ASC').page(0)  #1 Hoge.page(0).order('created_at ASC')  #2 1の方は、Hogeをcreated_atで昇順で並び替えた後に1ページ目の件数分を取得? 2の方は、Hogeから1ページ目の件数分を取得した後に並び替える? ということは1と2で結果が同じになることは保証されないのでは? という話。 結論 同じでした! 検証してみる コンソールで実行し、流れているSQLを確認します。 1:先にorderするパターン SELECT `products`.* FROM `products` ORDER BY created_at ASC LIMIT 11 OFFSET 0 2:後からorderするパターン SELECT `products`.* FROM `products` ORDER BY created_at ASC LIMIT 11 OFFSET 0 一緒ですね。 補足 あくまで1、2のような単純な例での話なのかもしれない。 気になる方は上記のようにコンソール実行して流れいているSQLを確認してみると良きかもです。 「このパターンだと結果変わる!」みたいなことあったら教えていただけると嬉しいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails かしこさ

railsのかしこさに感動 title $ rails g model Friendly Running via Spring preloader in process 12491 invoke active_record create db/migrate/20210913142600_create_friendlies.rb create app/models/friendly.rb invoke test_unit create test/models/friendly_test.rb create test/fixtures/friendlies.yml マイグレーションファイル class CreateFriendlies < ActiveRecord::Migration[5.2] def change create_table :friendlies do |t| t.timestamps end end end ちゃんとfriendliesになっている!?? friendlysになると思ったけどならなかった すげぇ 以上w
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsの標準設定のエラーについて

Rails-tutorial3章学習中に躓いてしまったので今後のために記事にしてみます。 *発生したエラー ・Railsの標準設定のバージョンとgemでのRailsのバージョンがload_defaultエラー ・本来Rails-tutorialでの学習はRails6.0.3で進めていくのだが、 標準設定のバージョンが6.1.3.2になってしまっているため、Railsアプリ側を変更しなければいけなくなってしまっている? *やってみたこと ・gem list railsで全ての使用できるRailsバージョンを確認 gem uninstall railties -v 6.1.3.2で6.0.3以外のRailsバージョンを全て削除→Rails -vで確認→6.0.3になっていない... ・rbenvでRubyを管理しており、Rubyのバージョンも何かRailsに関係しているのか?と思いXcodeからもう一度rbenvをインストールし直し→ xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance またエラーが出てきた.. 2日間進められてないのでまた違う方法で戦ってみます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby3.x+Rails6+CircleCI+Rspec+Rubocop+MySQL8のプロジェクト作った。(ソースコードあり)

プロジェクトを立てるたびに同じようなプロジェクト作成作業をするのが手間なので、ソースコードを残しておく。 OSSライセンスにしておくので、この環境で使いたい人がいたら、使ってください。 環境 Ruby3.x Rails6 CircleCI Rspec Rubocop MySQL8 ソースコード
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】gemのアンインストールは、慎重に。

1.背景 Rubyを使用して個人開発を行っています。 使用を検討していたgem(ActiveRecord)をインストールしたものの結局使わなかったのでアンインストールしたところ、 別プロジェクトのデータベースが消えてしまい、「慎重にやっておけば良かった...」と思いました。 今回はその反省を備忘録としてまとめます。 2.環境 mac.os バージョン10.15.6 Ruby 2.7.3 Rails 6.1.3.1 psql (PostgreSQL) 12.6 3.アンインストールを実行 下記のコマンドを実行し、Gemfileからも削除、bundle installを行いました。 project_name % bundle exec gem uninstall ActiveRecord その結果、無事削除することができました。しかし、別プロジェクト(RubyとRuby on Rails使用)のデータベースが削除されてエラーになりました。 データベースを作成し直した話はこちら(作成中) 補足:bundle execコマンドについて bundle execコマンドとは、アプリのGemfile.lockに記載されているgemを使用するコマンドを言います。今回の場合だと該当プロジェクト内のGemfile.lockに沿ってアンインストールが実行されていることになります。 特定のプロジェクトのみ使用しているgem(またはバージョン)だと一部アンインストールになるのですが、いろんなところで使用している場合だとその分影響する範囲が多くなります。 「bundle exec」をつけると特定のプロジェクトのgemのみをアンインストールできるという思い込みが失敗の原因でした 4.gemとは gemをまとめると下記のようになります。 ライブラリのうち、外部ライブラリに該当する インストールと読み込みで使用することができる 外部ライブラリのファイルやフォルダを1つのgem形式のファイルにパッケージングされたもの 5.インストール時とアンインストール時の違い インストールを行うとgem listに追加され、アンインストールを行うとgem listから削除されます。 # project_name % gem list  (--local) gem名 project_name % gem list  Activerecord *** LOCAL GEMS *** # gem名 (カッコ内はバージョン名) が表示される # アンインストールするとブランクになる activerecord (6.1.3.2, 6.1.3.1, 6.1.3, 6.1.2.1, 6.0.3.4) activerecord-import (1.0.8) kaminari-activerecord (1.2.1) ... 今回はアンインストールをすることでインストールそのものをなかったことにしているので、インストール+読み込みで使用できる条件から外れてしまい、別プロジェクトのデータベースが消えてしまいました。 補足:アンインストールを使うときはこんなとき (本当に)不要になったとき 古いバージョンのものを削除したいとき ※アップデートした結果、残った古いバージョンのgemを削除する場合は gem cleanupというコマンドもあります。 6.参考 1.【Rails】gemのアンインストール・バージョン変更 2.library rubygems 3.【Ruby】 gemの仕組みを図解形式で学ぼう 4.【Rails】gemとbundleについてまとめてみた 5.【Rails】 結局bundlerって何?bundlerの仕組みを図解形式で徹底解説 6.RubyGemsの使い方 7.最後に 記事の感想や意見、ご指摘等あれば伝えていただけるとありがたいです。 読んでいただき、ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

view内でif文を用いた条件分岐のスマートな書き方[Ruby, Rails]

はじめに 今回の記事はとても局所的なテーマを扱います Rubyの構文において、以下のようなif文を用いた冗長的な書き方を、よりスマートにまとめます app/views/announcement.html.erb Before <th>配信元</th> <td> <% if @announcement.user_id %> <%= @announcement.user.name %> <% else %> 管理者 <% end %> </td> 結論 三項演算子を用いて、かつ文字列の部分はStringオブジェクトにします After <th>配信元</th> <td><%= @announcement.user_id ? @announcement.user.name : "管理者" %></td> 想定状況 announcementインスタンスはuserインスタンスに紐づく、もしくは紐づいていない、状況です app/models/user.rb class User < ApplicationRecord has_many :announcements, dependent: :destroy end app/models/announcement.rb class Announcement < ApplicationRecord belongs_to :client, optional: true end ポイント 文字列の部分をStringクラスにしていること 以下の場合、Encountered a syntax error while rendering templateのエラーが発生し、失敗します。理由は、Railsが<%= %>のなかに、存在しない変数もしくはメソッドを探してしまうからです(管理者の部分)。 なので、ただの文字列の場合でもクオテーションで囲んであげることで、ただの文字列を文字列オブジェクトにする必要があります。 失敗例 <th>配信元</th> <td><%= @announcement.user_id ? @announcement.user.name : 管理者 %></td> # 管理者 → "管理者" こうしないとだめ さいごに とても小さなテーマですが、5行が1行になったことは感動しました(知識不足なだけやん 最後までお読み頂きありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】bulletを使ってN + 1問題解決

N + 1問題とは N+1問題とは、データベースからデータを取り出す際に、大量のSQLが発行されてパフォーマンスが低下してしまう問題のことです。以前にN + 1問題について配信してありますので気になった方はご参照ください。 bulletとは N + 1問題がどこに発生しているかお知らせしてくれるgemです。 公式のドキュメント 導入方法 以下のコードをGemfileに追記。 Gemfile group :development do gem 'bullet' end $ bundle install デフォルト設定 config/environments/development.rb Rails.application.configure do # ここから config.after_initialize do Bullet.enable = true Bullet.alert = true Bullet.bullet_logger = true Bullet.console = true # Bullet.growl = true デフォルトでコメントアウト Bullet.rails_logger = true Bullet.add_footer = true end # ここまでが追加。 end (解説) * Bullet.enable...Bulletのgemを利用可能 * Bullet.alert...ブラウザにJSのアラート表示 * Bullet.bullet_logger...bulletのログファイルを表示 * Bullet.console...console.logに警告 * Bullet.growl...Growlがインストールされているときに、ポップアップの警告を表示 * Bullet.rails_logger...railsのログに警告を表示 * Bullet.add_footer...画面左下にメッセージを表示 N + 1問題検出 実際に使用すると、下記の感じで警告が表示。 ご丁寧に修正方法まで記載 表示の通りコントローラーにincludes[:user])に修正 #before @chats = Chat.all #after @chats = Chat.includes(:user) [Before] [After] includesを指定することで関連をまとめて取得し、最小限のクエリ回数を減らせました。 最後に N+1問題に自分で気づけない人のために便利だと思いますが、やはり設計、開発でN+1問題が生じない為にもSQLに強くなる必要があると感じました。今回、SQLのクエリの画像を残すべきところを失念しており申し訳ございません
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails6で、An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue.が出た時、の対処

Rails6で、下記が出た時の対処 An error occurred while installing mysql2 (0.5.3), and Bundler cannot continue. 下記を実行する。 $ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include" $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib" 再度bundle installをする $ bundle install
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

エラー:Routing Error_Uninitialized constant HomesControllerにつまづいた話

Ruby on Rails ver.5.2.5にて通販サイトの作成をするにあたり、namespaceとscope moduleの使い分けができておらず発生したエラー。 初心者ゆえの初歩的なミスですが、備忘録として記しておきます。 ■エラー内容 devise にて管理者側と顧客側を定義し、namespaceによりcontrollerをそれぞれ[controllers/admin]と[controllers/public]に棲み分けて作成しました。 そしてrutes.erbを以下のように記載 各controllerにアクション名を定義し、いざサーバー起こしてページ確認しようと思ったら、、 Routing Error Uninitialized Constant HomeController というエラーが発生。 エラーの内容は、namespaceにて定義されているadmin側のルーティングは辿れるけど、それより前のルーティングは一体どこの階層のコントローラを呼んでんの?分からないよ?というエラーでした。 ■解決方法 scope moduleでpublic側も設定してあげないといけなかったようです。 ここで使用した scope module: 'public' do 〜 end ですが、namespaceとは異なり、URLに/publicを追加せず、controller#actionにだけpublic/を追加することができるようです。 public側はURLに/publicを表示しないという仕様のため、namespaceで指定しなければいいのか〜と思っていたのですが、コントローラアクションはちゃんとpublicフォルダ内のコントローラを使うよ!と設定してあげないといけなかったんですね。 勉強になりました...。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails6 コメント機能でよくある問題の解決方法】

実装内容 以前に投稿したコメント機能実装の記事では、お伝えできなかったコメント機能で起こりうる問題点とその解決方法をまとめてみました。 解決する問題一覧 改行問題 半英数字の連続文字によるはみ出し問題 改行問題(プレビュー) before after 半英数字の連続文字によるはみ出し問題(プレビュー) before after 環境 macOS Big Sur 11.2.3 ruby: 2.7.2 rails: 6.1.3 jQuery テンプレートエンジン: slim レイアウト: bootstrap4 改行問題の解決法 改行しても反映されず、文字が続いて表示されてしまう問題から解決していきます。 app/views/comments.hide_comments.html.slim = comment.comment # before = simple_format(comment.comment) # after Railsのヘルパーメソッドであるsimple_formatを使用することで、コメントを以下の条件で整形し、改行されるようになります。 文字列を<p>で囲む 改行には<br />を付与 連続した改行は、</p><p>を付与 英数字の連続文字によるはみ出し解決法 日本語の場合、単語の途中でも自動で改行されるのですが、英数字の場合、表示範囲を超える連続する長いものは改行されずはみ出してしまいます。 app/assets/stylesheets/application.scss body { // 半角英数折返しの設定 word-wrap: break-word; overflow-wrap: break-word; } CSSのword-breakプロパティを使用し、値をbreak-wordとすることで、枠内に収まらない英単語の場合は単語の途中でも折り返しますが、枠内に収まる限り、単語の途中では折り返さないようにしてくれます。また、overflow-wrapはword-wrapの古い名称で、サポートされていないブラウザもあるため、併記した方がいいようです。 最後に 以上でコメント機能でよくある問題の解決方法でした! 実はポートフォリオ完成後にレビュー会を行なったのですが、その時指摘してもらい、初めて気づいた感じでした^^; 間違っている箇所や分かりづらい箇所が多々あるかと思います。 その際は、気軽にコメントいただけれると幸いです。 最後までご覧いただき、ありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails g kaminari:views bootstrap4でNo such file or directoryのエラー解決方法

実装したいこと ある記事を参考にgem 'kaminari'を導入してページネーション機能を作ろうとしておりました。 gemの導入後に、% docker-compose run web rails g kaminari:views bootstrap4コマンドを実行したところタイトルのようなエラーが発生したので解決に至るプロセスをまとめようと思います。 エラー内容 % docker-compose run web rails g kaminari:views bootstrap4 % docker-compose run web bundle exec rails g kaminari:views bootstrap4 Creating locat_web_run ... done Running via Spring preloader in process 29 /usr/local/bundle/gems/kaminari-core-1.2.1/lib/generators/kaminari/views_generator.rb:117:in `initialize': No such file or directory @ rb_sysopen - https://api.github.com/repos/amatsuda/kaminari_themes/git/refs/heads/master (Errno::ENOENT) from /usr/local/bundle/gems/kaminari-core-1.2.1/lib/generators/kaminari/views_generator.rb:117:in `open' from /usr/local/bundle/gems/kaminari-core-1.2.1/lib/generators/kaminari/views_generator.rb:117:in `get_files_in_master' from /usr/local/bundle/gems/kaminari-core-1.2.1/lib/generators/kaminari/views_generator.rb:41:in `themes' from /usr/local/bundle/gems/kaminari-core-1.2.1/lib/generators/kaminari/views_generator.rb:30:in `copy_or_fetch' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/command.rb:27:in `run' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/invocation.rb:127:in `invoke_command' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/invocation.rb:134:in `block in invoke_all' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/invocation.rb:134:in `each' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/invocation.rb:134:in `map' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/invocation.rb:134:in `invoke_all' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/group.rb:232:in `dispatch' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/base.rb:485:in `start' from /usr/local/bundle/gems/railties-6.1.3.1/lib/rails/generators.rb:275:in `invoke' from /usr/local/bundle/gems/railties-6.1.3.1/lib/rails/commands/generate/generate_command.rb:26:in `perform' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/command.rb:27:in `run' from /usr/local/bundle/gems/thor-1.1.0/lib/thor/invocation.rb:127:in `invoke_command' from /usr/local/bundle/gems/thor-1.1.0/lib/thor.rb:392:in `dispatch' from /usr/local/bundle/gems/railties-6.1.3.1/lib/rails/command/base.rb:69:in `perform' from /usr/local/bundle/gems/railties-6.1.3.1/lib/rails/command.rb:50:in `invoke' from /usr/local/bundle/gems/railties-6.1.3.1/lib/rails/commands.rb:18:in `<main>' from /usr/local/bundle/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `require' from /usr/local/bundle/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:23:in `block in require_with_bootsnap_lfi' from /usr/local/bundle/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/loaded_features_index.rb:92:in `register' from /usr/local/bundle/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:22:in `require_with_bootsnap_lfi' from /usr/local/bundle/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:31:in `require' from /usr/local/bundle/gems/zeitwerk-2.4.2/lib/zeitwerk/kernel.rb:34:in `require' from /locat/bin/rails:5:in `<main>' from /usr/local/bundle/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:59:in `load' from /usr/local/bundle/gems/bootsnap-1.7.3/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:59:in `load' from /usr/local/bundle/gems/spring-2.1.1/lib/spring/commands/rails.rb:6:in `call' from /usr/local/bundle/gems/spring-2.1.1/lib/spring/command_wrapper.rb:38:in `call' from /usr/local/bundle/gems/spring-2.1.1/lib/spring/application.rb:220:in `block in serve' from /usr/local/bundle/gems/activesupport-6.1.3.1/lib/active_support/fork_tracker.rb:10:in `block in fork' from /usr/local/bundle/gems/activesupport-6.1.3.1/lib/active_support/fork_tracker.rb:10:in `block in fork' from /usr/local/bundle/gems/activesupport-6.1.3.1/lib/active_support/fork_tracker.rb:8:in `fork' from /usr/local/bundle/gems/activesupport-6.1.3.1/lib/active_support/fork_tracker.rb:8:in `fork' from /usr/local/bundle/gems/activesupport-6.1.3.1/lib/active_support/fork_tracker.rb:26:in `fork' from /usr/local/bundle/gems/activesupport-6.1.3.1/lib/active_support/fork_tracker.rb:8:in `fork' from /usr/local/bundle/gems/activesupport-6.1.3.1/lib/active_support/fork_tracker.rb:26:in `fork' from /usr/local/bundle/gems/spring-2.1.1/lib/spring/application.rb:180:in `serve' from /usr/local/bundle/gems/spring-2.1.1/lib/spring/application.rb:145:in `block in run' from /usr/local/bundle/gems/spring-2.1.1/lib/spring/application.rb:139:in `loop' from /usr/local/bundle/gems/spring-2.1.1/lib/spring/application.rb:139:in `run' from /usr/local/bundle/gems/spring-2.1.1/lib/spring/application/boot.rb:19:in `<top (required)>' from <internal:/usr/local/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require' from <internal:/usr/local/lib/ruby/3.0.0/rubygems/core_ext/kernel_require.rb>:85:in `require' from -e:1:in `<main>' ERROR: 1 kaminari導入後に、bootstrap4のページネーションのデザインに合わせたビューファイルを上記のコマンドで実行したところエラーが発生しデザインを適用できない状態になりました。 こちらの記事を参考にしたところ、既にrequire 'open-uri'は記述されていたためエラー解決できませんでした。 解決方法 こちらの記事を参考にしたところ、 gem 'kaminari'を gem 'kaminari', git: 'https://github.com/kaminari/kaminari' に修正した後にで解決できたと記載されていました。 gemfileを修正後にbundle installを行い、再度コマンドを実行したところbootstrapが適用できました。 % docker-compose run web rails g kaminari:views bootstrap4 Creating locat_web_run ... done Running via Spring preloader in process 29 downloading app/views/kaminari/_first_page.html.erb from kaminari_themes... create app/views/kaminari/_first_page.html.erb downloading app/views/kaminari/_gap.html.erb from kaminari_themes... create app/views/kaminari/_gap.html.erb downloading app/views/kaminari/_last_page.html.erb from kaminari_themes... create app/views/kaminari/_last_page.html.erb downloading app/views/kaminari/_next_page.html.erb from kaminari_themes... create app/views/kaminari/_next_page.html.erb downloading app/views/kaminari/_page.html.erb from kaminari_themes... create app/views/kaminari/_page.html.erb downloading app/views/kaminari/_paginator.html.erb from kaminari_themes... create app/views/kaminari/_paginator.html.erb downloading app/views/kaminari/_prev_page.html.erb from kaminari_themes... create app/views/kaminari/_prev_page.html.erb 同じようなエラーに遭遇している方の参考になれば幸いです。  開発環境 rubymine ruby(3.0.1) Ruby on rails (6.1.3.1) Docker (20.10.7)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「bundle exec cap production puma:start」が使えない時の対処方法

はじめに 下記の記事を参考に本番環境を構築中、 https://qiita.com/d0ne1s/items/2dd0ec73db1b0f473509 「bundle exec cap production puma:start」実行時にエラーが発生したため 解決方法をまとめた。 エラー内容 % bundle exec cap production puma:start (Backtrace restricted to imported tasks) cap aborted! Don't know how to build task 'puma:start' (See the list of available tasks with `cap --tasks`) (See full trace by running task with --trace) 環境 rails 6.1.4 ruby 2.7.3 nginx 1.20.1 puma 4.3.8 解決方法 Capfileに「install_plugin Capistrano::Puma::Daemon」を追加する。 require "capistrano/setup" require "capistrano/deploy" require 'capistrano/rails' require "capistrano/rbenv" require "capistrano/bundler" require "capistrano/rails/assets" require "capistrano/rails/migrations" require "capistrano/scm/git" require "capistrano/puma" install_plugin Capistrano::SCM::Git install_plugin Capistrano::Puma install_plugin Capistrano::Puma::Daemon. <ー追加 Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r } ・ ・ ・ まとめ pumaをデーモン化していたため、Capfileに追記が必要だった。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ページング kaminari ページャ

gem gem 'kaminari','~> 1.2.1' ターミナル $ bundle install $ rails g kaminari:config $ rails g kaminari:views default Ostomy/index.html.erb : <%= paginate @ostomies %> ページ数 指定する .page(params[:page]).reverse_order app/controllers/〜controller.rb #デフォルトで件数設定されているので後で変更 : def index @ostomies= Ostomy.all.page(params[:page]).reverse_order end #それか.per(ほしいページ数)    .reverse_order:最新から表示 def index @ostomies= Ostomy.all.page(params[:page]).per(7) end def index @ostomies= Ostomy.all.page(params[:page]).per(7).reverse_order end config/initializers/kaminari_config.rb Kaminari.configure do |config| # config.default_per_page = 25 デフォルトでは25件となっているここ変更 # config.max_per_page = nil # config.window = 4 # config.outer_window = 0 # config.left = 0 # config.right = 0 # config.page_method_name = :page # config.param_name = :page # config.max_pages = nil # config.params_on_first_page = false end 日本語化する config/application.rb config.i18n.default_locale = :ja config/lacales/ja.yml ja: views: pagination: first: '最初' last: '最後' previous: '前ページ' next: '次ページ' truncate: '〜'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

単体テストの下準備 手順

※著者がiMacユーザーの為、 コマンドは「ターミナル」で実行するものとして記述しています。 Ruby on Railにおける 単体テストの手順をまとめます。 gem 'rspec'インストール rails g rspec:install .rspecに--format documentation rails g rspec:model モデル名 1. gem 'rspec' インストール Gemfileに記述後、コマンドでbundle installをかけます。 注意点は、Gemfileの行末ではなく group :development, :test do の箇所に記述するところ。 Gemfile group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'rspec-rails', '~> 4.0.0' end ターミナル % bundle install 2. rails g rspec:install さらに、コマンドでrailsにrspecをインストールします。 ターミナル % rails g rspec:install 3. .rspecに--format documentation .rspecファイルに記述を追加します。 これを入れることで、テストコードの結果が可視化されるとのこと。 .rspec --require spec_helper --format documentation 4. rails g rspec:model モデル名 テスト用のモデルファイルを作成します。 ここではモデル名を仮にuserとしています。 ターミナル % rails g rspec:model user これで準備は完了しました。 あとは作成されたモデルファイルに記述を行い bundle exec rspec spec/models/user_spec.rb を実行して動作確認を行なっていきます。 なお、単体テスト時は FactoryBot Faker といったgemを併用することで 効率よく進めることができます。 今回は以上です。 お読みくださりありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails】退会機能をgemなしで実装する方法

対象者 退会機能を実装予定の方 目的 退会機能を実装して退会後、ログイン出来ないようにする 実際の手順と実例 1.deviseの導入 User認証で新規登録とログインを行うためにdeviseを導入します Gemfile. gem 'devise' Terminal. $ bundle install $ rails g devise:install $ rails g devise user name:string is_valid:boolean #① $ rails g devise:views ①で退会したかどうかを判断するカラムを作成しています。 booleanは真偽のどちらの値なのかを決めるデータ型です。 boolean型はデフォルト値を設定する必要があるので、マイグレーションファイルを編集します。 db/migrate/20210815082848_add_is_valid_to_users.rb class AddIsValidToUsers < ActiveRecord::Migration[5.2] def change add_column :users, :is_valid, :boolean, default: true, null: false end end デフォルト値がtrue(有効)に設定しているのでfalseが退会している状態を表しています。 Terminal. $ rails db:migrate 実行後下記のようにテーブルが作成されます。 db/schema.rb create_table "users", force: :cascade do |t| t.string "email", default: "", null: false t.string "encrypted_password", default: "", null: false t.string "reset_password_token" t.datetime "reset_password_sent_at" t.datetime "remember_created_at" t.string "name" t.boolean "is_valid", default: true, null: false t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["email"], name: "index_users_on_email", unique: true t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true end 2.コントローラーの設定 Homes_Controllerに作成していきます。 app/controllers/homes_controller.rb def unsubscribe #退会画面 @user = current_user end def withdraw #退会処理 @user = User.find(params[:id]) @user.update(is_valid: false) #falseにすることで退会済に変更 reset_session redirect_to root_path, alert: "ご利用誠にありがとうございました。" end 続いて退会済のUserが再ログインできないようにSessions_Controller に設定していきます。 app/controllers/users/sessions_controller.rb before_action :reject_user, only: [:create] : (中略) : # 退会後のログインを阻止 def reject_user @user = User.find_by(name: params[:user][:name]) if @user if @user.valid_password?(params[:user][:password]) && (@user.active_for_authentication? == false) flash[:error] = "退会済みです。" redirect_to new_user_session_path end else flash[:error] = "必須項目を入力してください。" end end 3.ルーティングの設定 config/routes.rb get "unsubscribe/:name" => "homes#unsubscribe", as: "confirm_unsubscribe" patch ":id/withdraw/:name" => "homes#withdraw", as: "withdraw_user" put "withdraw/:name" => "users#withdraw" 4.Viewの設定 app/views/homes/unsubscribe.html.erb <div class = "container"> <div class = "title text-center">本当に退会しますか?</div> <div class = "card unsub-text"> <div class = "row justify-content-center"> <div class = "text-center"> <p class = "py-3"> 退会すると、会員登録情報が閲覧できなくなります。<br> 退会する場合は『退会する』をクリックしてください。 </p> <div class = "row unsub-text mt-3"> <div class = "no-delete"> <%= link_to "退会する", withdraw_user_path(@user), method: :patch, data: { confirm: '本当に退会しますか?' }, class: "btn btn-outline-danger btn-sm " %> </div> <div class = "float-right"> <%= link_to "退会しない", user_path(@user), class: "btn btn-outline-primary btn-sm" %> </div> </div> </div> </div> </div> </div> ※bootstrap4を使用しています。 applicaiton.scss // 退会機能 .unsub-text { text-align: center; margin: 50px; } .no-delete { margin-left: 50px; margin-right: 100px; text-align: center; } これで実装完了です! 参照 Rubyでbooleanの判定を行う方法を現役エンジニアが解説【初心者向け】
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

トランザクションとは。

はじめに 本記事では、トランザクションについて記述しました。 トランザクションとはなんですか? と聞かれた際に、私は何も答えることができませんでした。 悔しかったので調べました。 トランザクションとは レコードの更新を行う複数の処理を1つにまとめて行うことを指します。 トランザクションを利用することにより、 「処理の一部は成功し、一部は失敗した」という事象は発生せず、 すべての処理の成功または失敗のみの状態を作ることができます。 Railsではこのような利用 ActiveRecord::Base.transaction do 処理1 処理2 処理3 ... end ここに処理1、処理2...を1つのまとまりとして記述することで、 処理が1つでも失敗すれば、全体としての処理は失敗ということになります。 トランザクションのACIDプロパティー 以下を参照しています。 トランザクションは、銀行のATMに例えることが多いみたいです。 かなりわかりやすいので勝手にオススメです。 トランザクションの ACID プロパティー トランザクション処理における ACID という頭字語は、原子性 (A)、一貫性 (C)、独立性 (I)、および耐久性 (D) というトランザクションの 4つの重要なプロパティーを表しています。 A 原子性を表すAtomicity トランザクションが終わった時に、 そこに含まれていた更新処理が全て実行されるか、 全て実行されない状態で終わることを保証する性質。 ある口座から別の口座に資金を移動するアプリケーションで、原子性プロパティーは、ある口座から引き落としが正常に行われると、対応する入金が別の口座に行われることを保証します。 C 一貫性のConsistency トランザクションに含まれる処理はそれぞれの制約を満たすという性質。 ある口座から別の口座に資金を移動するアプリケーションで、一貫性プロパティーは、各トランザクションの開始時と終了時で、両方の口座の資金の合計金額が同じになることを保証します。 I 独立性のIsolation トランザクションが実行中の場合、 もう一方のその他のトランザクションの影響を受けないという性質。 ある口座から別の口座に資金を移動するアプリケーションで、独立性プロパティーは、別のトランザクションから見て移動資金がいずれかの口座に存在していて、両方に存在していたりどちらにも存在しなかったりすることはないことを保証します。 D 耐久性のDurability トランザクションが完了した後、そのデータ状態が保存され失われることは無いという性質。 ある口座から別の口座に資金を移動するアプリケーションで、耐久性プロパティーは、それぞれの口座に対して行われた変更が元に戻されることはないことを保証します。 以上です。 終わりに 今回もスマッシュブラザーズで例えてやろうと考えており、 ファルコンパンチってトランザクションじゃないかなとか思ったんですが、 ファルコンパンチってBボタンを押したら、モーションはあるものの、 複数の処理を1つにまとめているかと言われたら違うような気がしたので、やめました。 自分の知らなかった言葉を 何か身近なものに例えて理解するのはとてもいいなと感じております。 以下参考サイトです。 「トランザクションのACID特性」を理解する トランザクションの ACID プロパティー 明日も頑張ります!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む