20220113のRubyに関する記事は13件です。

【Rails】ツイートを作成順ではなく、いいねした順に表示したい

概要 ツイート投稿機能とツイートへのいいね機能を持つアプリケーションを開発中、 いいねした順番にツイートを取得する方法について調べたのでメモ。 環境 ruby 3.0.2 rails 6.1.4 mysql 8.0.26 やりたいこと ツイートの作成順がデフォルトの時に、 ツイートの作成順ではなくユーザーがいいねした順にツイートを取得したい。 先に結論 reorderを使用し、中間テーブルのカラムを直接指定する users_controller.rb # ユーザー詳細画面で表示したい場合 def show @user = User.find(params[:id]) @favorites = @user.favorite_tweets.reorder('favorites.created_at DESC') end 以下、詳細 関連するモデル user.rb class User < ApplicationRecord has_many :tweets, dependent: :destroy has_many :favorites, dependent: :destroy has_many :favorite_tweets, through: :favorites, source: :tweet end tweet.rb class Tweet < ApplicationRecord belongs_to :user has_many :favorites, dependent: :destroy has_many :favorite_tweets, through: :favorites, source: :tweet # ツイートのデフォルトとしては投稿順に並べたいためここで指定 default_scope -> { order(created_at: :desc) } end favorite.rb class Favorite < ApplicationRecord belongs_to :user belongs_to :tweet end ER図 結論に至るまで コンソールで確認しつつ試行錯誤。 # userに一人目のユーザーを取得 user = User.find(1) # favoritesに、userがいいねしたツイートを取得 favorites = user.favorite_tweets これだと、tweetのデフォルトである、 tweetsテーブルのcreated_atカラムの降順 での取得となってしまう。 (このデフォルトはtweet.rbのdefault_scopeで指定しているもの) そもそもどんなクエリが発行されているのか? ActiveRecordで発行されるSQLを確認するのに、to_sqlという便利なメソッドがあるとのこと。 先ほどの中身を確認。 # userに一人目のユーザーを取得 user = User.find(1) # userがいいねしたツイートを取得するSQLを確認 user.favorite_tweets.to_sql # 見やすいよう改行 => "SELECT `tweets`.* FROM `tweets` INNER JOIN `favorites` ON `tweets`.`id` = `favorites`.`tweet_id` WHERE `favorites`.`user_id` = 1 ORDER BY `tweets`.`created_at` DESC" ORDER BY tweets.created_at DESC" とあるように、tweetsテーブルのcreated_atカラムをDESCで並べている。 指定したいのは ユーザーがツイートをいいねした順番 つまり、 中間テーブルのcreated_at なので、 上記ORDER BYの箇所を ORDER BY favorites.created_at DESC にできればいいのでは? defaultを上書きしたい # userに一人目のユーザーを取得 user = User.find(1) # userがいいねしたツイートを取得するSQLを確認 >> user.favorite_tweets.order('favorites.created_at DESC').to_sql # 見やすいよう改行 => "SELECT `tweets`.* FROM `tweets` INNER JOIN `favorites` ON `tweets`.`id` = `favorites`.`tweet_id` WHERE `favorites`.`user_id` = 1 ORDER BY `tweets`.`created_at` DESC, favorites.created_at DESC" ORDER BY tweets.created_at DESC, favorites.created_at DESC" .orderでは、デフォルトの後の指定として追加できるだけのよう。 ここで結論 reorderで初期化の上、順番を指定 # userに一人目のユーザーを取得 user = User.find(1) # userがいいねしたツイートを取得するSQLを確認 >> user.favorite_tweets.reorder('favorites.created_at DESC').to_sql # 見やすいよう改行 => "SELECT `tweets`.* FROM `tweets` INNER JOIN `favorites` ON `tweets`.`id` = `favorites`.`tweet_id` WHERE `favorites`.`user_id` = 1 ORDER BY tweet_bookmarks.created_at DESC" 無事、意図通りのいいね順で取得することができた。 参考にした記事 reorder含む、default_scopeの初期化 【Railsドキュメント】reorderについて 最後に より良い方法や間違い等ありましたらご指摘いただけますと幸いです!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

確認ダイアログをBootstrapで見栄え良くする

前提 ・CRUD処理の実装はOK ・Bootstorapが導入済みである 開発環境 Ruby2.6.3 Rails5.2.5 Bootstrap4 目標 # 前後の記述は省略 <%= link_to "削除", post_path(post), method: :delete, data: { confirm: "削除しますか?" } %> 上記のように記述した時に出る削除確認ダイアログ これだとちょっと味気ないので Bootstrapを使ってこんな感じにしていきます。 実装方法 BootstrapのModalのページのコードを利用していきます。 # ページに表示されるボタン <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#exampleModal">削除</button> # 確認用のモーダル <div class="modal fade" id="exampleModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header">                 # モーダルのタイトル部分 <h5 class="modal-title" id="exampleModalLabel">削除確認</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div>             # モーダルのbody部分、確認メッセージなど入れます <div class="modal-body">削除しますか?</div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal">やめる</button> <%= link_to "削除", post_path(post), method: :delete, class: "btn btn-danger" %> </div> </div> </div> </div> 以上の記述で上の画像のような確認画面になると思います。 ボタンの色などは適宜自分の好きな色に変えています。 ここまでは問題なく実装できたのですが、以下私が躓いた所です。 繰り返し処理でデータを表示している場合、上記の記述のままだと一番目のデータだけが削除の対象になってしまいました。(ページに表示されているモーダルのトリガーとなる削除ボタンにpost.idの指定がないからだと思います) なので、どのデータを削除するのかIDを追加してあげる必要がありました。 # ページに表示されるボタン <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#exampleModal<%= post.id %>">削除</button> # 確認用のモーダル <div class="modal fade" id="exampleModal<%= post.id %>" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> <div class="modal-dialog" role="document"> <div class="modal-content"> <div class="modal-header">                 # モーダルのタイトル部分 <h5 class="modal-title" id="exampleModalLabel">削除確認</h5> <button type="button" class="close" data-dismiss="modal" aria-label="Close"> <span aria-hidden="true">&times;</span> </button> </div>             # モーダルのbody部分、確認メッセージなど入れます <div class="modal-body">削除しますか?</div> <div class="modal-footer"> <button type="button" class="btn btn-primary" data-dismiss="modal">やめる</button> <%= link_to "削除", post_path(post), method: :delete, class: "btn btn-danger" %> </div> </div> </div> </div> 2ヶ所に<%= post.id %>を追加しています。 まずはモーダルを表示するためのトリガーとなる削除ボタンのdata-target部分。 <button type="button" class="btn btn-danger" data-toggle="modal" data-target="#exampleModal<%= post.id %>">削除</button> あとはモーダルのid部分です。 <div class="modal fade" id="exampleModal<%= post.id %>" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true"> これで繰り返し処理をしても指定したデータを削除することができます。 他にも色々なタイプのモーダルがあるのでいずれ使ってみたいです。 以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

gem installに失敗してた原因と解決方法

環境 MacBook Pro (16-inch, 2019) macOS Big Sur 11.6.2 Xcode13.2 ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin20] rbenv 1.2.0のインストール済み(参考:rbenvでrubyのバージョンを管理する - Qiita) 発生していたこと① gem install jazzy をすると、パーミッションエラー ERROR: While executing gem ... (Gem::FilePermissionError) You don't have write permissions for the /Library/Ruby/Gems/2.6.0 directory. 原因 gemのインストールはsudo付けない方が良い(が過去につけたせいで持ち主が管理者に変わってた) 解決方法 オーナー変更chown -R <user名>:staff /Users/<user名>/.rbenv/versions/2.6.5 発生していたこと② (sudo) gem install jazzy をすると必要なファイルがないよと言われる Building native extensions. This could take a while... ERROR: Error installing jazzy: ERROR: Failed to build gem native extension. current directory: /Library/Ruby/Gems/2.6.0/gems/redcarpet-3.5.1/ext/redcarpet /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r ./siteconf20220112-1918-u1r6no.rb extconf.rb creating Makefile current directory: /Library/Ruby/Gems/2.6.0/gems/redcarpet-3.5.1/ext/redcarpet make "DESTDIR=" clean current directory: /Library/Ruby/Gems/2.6.0/gems/redcarpet-3.5.1/ext/redcarpet make "DESTDIR=" make: *** No rule to make target /Applications/Xcode13.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX12.0.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin20/ruby/config.h', needed byautolink.o'. Stop. make failed, exit code 2 Gem files will remain installed in /Library/Ruby/Gems/2.6.0/gems/redcarpet-3.5.1 for inspection. Results logged to /Library/Ruby/Gems/2.6.0/extensions/universal-darwin-20/2.6.0/redcarpet-3.5.1/gem_make.out 確認したこと インストールされているrubyのバージョンを確認rbenv versions system * 2.6.5 (set by /Users//.rbenv/version) Rubyコマンドの参照先をチェックwhich ruby /usr/bin/ruby rbenv で Ruby をインストールするところまではできているが、インストールした Ruby を使うところがうまくいってない。 Rubyコマンドの参照先を確認which rbenv /usr/local/bin/rbenv コマンド検索パスを確認echo $PATH /usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin 使っているシェル確認echo $SHELL /bin/zsh 原因 使ってるシェルがbashではなくzshだった よって設定書くファイルが違っていた ~/.bash_profile にeval "$(rbenv init -)" を追記していた 参考:bashとzshの違い。bashからの乗り換えで気をつけるべき16の事柄 2019年、WWDC19の基調講演でApple社は次にリリースする「MacOS X Catalina」より標準のシェルを「zsh」に変更すると発表しました。そして現在、Macを購入したり最新のバージョンにアップデートしてターミナルを開くとbashではなくzshが起動します。 解決方法 bashではなくzshに設定反映echo 'eval "$(rbenv init -)"' >> .zshrc 反映適用 source ~/.zshrc (ターミナルの再起動でも可) 再確認 インストールされているrubyのバージョンを確認rbenv versions system * 2.6.5 (set by /Users//STORESPayments-iOS-SDK/.ruby-version) Rubyコマンドの参照先を確認 which ruby /Users//.rbenv/shims/ruby コマンド検索パスを確認echo $PATH /Users//.rbenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Apple/usr/bin 使っているシェル確認echo $SHELL /bin/zsh →これは変更していないのでこのまま!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CRUD処理(rails6)エラー解決

CRUD処理を実装中に発生したエラーについてのアウトプット。 エラー内容 投稿した情報を削除しようとした時に発生したエラー。 削除なのにHTTPメソッドがGET、本来はDELETE. 考えられる原因 1.ルーティングが間違っている。 2.コントローラーアクション間違い 3.ビューファイル記述間違い エラー解消の流れ 1~3が間違っていないか確認。 ルーティング delete '/users/:id', to: 'users#destroy' コントローラー def destroy user = User.find(params[:id]) user.destroy end 削除ボタン追加 <%= link_to '削除', "/users/#{user.id}", method: :delete, data: {confirm: "削除しますか?"} %> ビュー <h1>削除完了</h1>   <%= link_to "一覧画面へ", "/users" %> 確認してみたがコードの間違いは見つけられず。 息詰まったのでエラーメッセージでググることに、link_toではなくbutton_toにすれば削除はできるとの記事を発見し、早速実施。 button_toにコードを書き換えると削除はできるようになったが、スッキリとは解決していないので再度情報収集。 結果 エラーの原因としてはRails7がリリースされたことによるdeleteメソッドの記述の仕方の変更。 エラーが発生した時のRails version $ rails -v $ rails 7.0.1 修正 ①インストールされているRailsのバージョン確認 $ gem list rails ②使用したいバージョンがないときはインストール実施 $ gem install rails -v 6.0.4.4 ③rails6で再度作成 $ rails _6.0.4.4_ new sample_app 確認 削除ができる。 エラーを解決しての感想 エラー文を見て、ルーティングエラーなのはわかると思うので、そこから一つ一つ、間違っている場所を潰していくことでエラーが解決できると思っていたが、 今回のエラーに関しては元の記述も間違っているところがなく手詰まり感がすごかった。 なんとか解決することができたのでまた一つ成長できたと思う。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Flutterのupgradeをしたら「CocoaPods installed but not working.」で苦戦した話

概要 Flutterを利用してiOSアプリを作成していたのだが、高解像度の画像をImage.networkで取得して表示するので、ページの読み込みに時間がかかっていた。 そこで、cached_network_imageをpubspec.yamlに記述してflutter pub getした。 画像の処理を書き換えて、いざflutter runすると、以下のようなエラーが発生した。 flutter doctorを実行 どうやらCocoaPodsがおかしいみたいだ。 installしているのにbrokenやらnot workingやら、内心「ハ・・・?」って感じ。 試したこと CocoaPodsの再インストール エラーにCocoaPods Guidesを参照してre-installしろとご丁寧に書いてある。 言われるがままに実行してみる。 $ sudo gem install cocoapods 変化がなかったので、一度アンインストールして入れ直す。 $ sudo gem uninstall cocoapods && sudo gem install cocoapods flutter doctorしてみたが、これも同じエラーが返された。ビルドも失敗。 再起動 再起動後、flutter doctorしたが、変化なし。 brewでCocoaPodsをインストール まずは、既存のCocoaPodsをアンインストールする。 $ sudo gem uninstall cocoapods 次に、brewでインストールしてみた。 $ brew install cocoapods flutter doctorしたが、変化なし。 解決策 CocoaPodsはRubyで動いているので、バージョンを上げることによって解決した。 今回は、rbenvを用いてアップグレードした。 $ brew install rbenv その後、バージョン一覧を取得 $ rbenv install --list 2.6.9 2.7.5 3.0.3 3.1.0 jruby-9.3.2.0 mruby-3.0.0 rbx-5.0 truffleruby-21.3.0 truffleruby+graalvm-21.3.0 最新版をインストールする。 現時点(2022/01/13)での最新版は3.1.0 本体にインストールされていたのは2.6.8だった。逆になんで今まで動いてたんだ...? $ rbenv install 3.1.0 $ rbenv global 3.1.0 $ rbenv init # Load rbenv automatically by appending # the following to ~/.zshrc: eval "$(rbenv init -)" 次に、上記のeval "$(rbenv init -)"を、~/.zshrcに追加した。 最後に、source ~/.zshrcをして、flutter doctorを実行すると、正常に動作した。 一日中ゴニョゴニョしてしまったので、忘備録として。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]未経験独学が読書を習慣化できるアプリを制作しました

1. はじめに 本記事を閲覧いただきありがとうございます! 私は現在、バックエンドエンジニアへの転職を目指して学習をしています。学んだことを活かし、Rails にてWebアプリを制作しましたので、概要や工夫した点などを記事にまとめてみました。 2. アプリ概要 ? BookDaily 「 読書 × 習慣化 」 読書を習慣化できるサービスです。 読む本を登録すると、毎日何ページまで読むかの目標が設定され、読書の進捗を管理することができます。 毎日何ページまで読めばいいのか、目標がひと目で確認できます! 読む本を登録 -> 読み終わる日を設定 -> 毎日の目標が設定 日々の読んだページ数の記録も簡単にできます。 進捗や達成率をわかりやすく表示し、モチベーションをアップ。 URL アプリ:https://book-daily.com GitHub:https://github.com/ao21/book_daily 3. 使用技術 フロントサイド HTML (erb) CSS (Scss) JavaScript (JQuery,erb) Bootstrap バックエンド Ruby (2.7.2) Ruby on Rails (6.1.3) サーバー Nginx(WEB サーバー) Puma(アプリケーションサーバー) DB PostgreSQL (13.2) インフラ AWS(VPC,RDS,EC2,S3,Route 53,ACM,ALB,IAM) 解析ツール Rails_best_practice (1.20) テスト RSpec (3.1.0) factory_bot (6.2.0) 4. 工夫した点 ① GoogleBooksAPIを用いたこと 書籍情報を登録するにあたって、GoogleBooksAPIを用いました。習慣化を目的としているため、ユーザーがシンプルに使えることを意識し、入力負荷を極力減らしました。また、データの整合性をより保つために採用しました。 ② チーム開発を意識した制作 現場での開発の流れを意識し、チーム開発を想定した制作を行いました。 GitHubのProjectsを用い、カンバン方式でタスクを管理 こまめにcommitし、変更点をまとめたプルリクエストを出しマージする流れを遵守 ブランチ運用はGitFlowを意識し、mainブランチ、developブランチ、featureブランチで運用 ③ 目標や成果を数字でわかりやすく表示 習慣化を行う際、「明確な小さな目標を達成し続けている」ことが重要だと考え、目標や成果を数字で表しています。 今日は何ページまで読めばいいのか 今日はあと何ページ読めばいいのか 今本を何%読んでいるのか 今月、先月は何ページ読んでいるのか こういった数字をActiveRecordを使ってデータを取得し計算し、グラフやカレンダーを効果的に用いて表示しています。 5. 開発で意識したこと ① エラー解決は言語化する エラーが出てすぐに解決できず詰まった際は、現状を言語化していました。 binding pryを活用し、原因の切り分けを行った上で、 「やりたいこと、現状、試してみたこと、仮設、疑問」をメモに書き出し、行き当たりばったりではなく論理的にエラーを解決できるように努めていました。 また、解決した際は解決策をそのメモにアウトプットすることで、エラー解決を学習の糧にすることができています。 ② 適切な質問を行う 上記の過程を経ても自身で解決できない場合、オンラインサロンのSlackにて質問を行いました。 開発当初は何がわからないかわからない状態が多かったですが、 「やりたいこと、現状、試してみたこと、仮設、疑問」のメモを元に、相手の方に適切な質問ができるように努めていました。テキストベースで質問をする力がかなり鍛えられました。 ③ ユーザーを意識した制作を行う 今回のアプリは友人の課題を解決することが目的だったので、友人(ユーザー)が使いやすいことを第一に制作しました。 開発を始める前に友人からヒアリングを行い、どんな機能が欲しいのかを明確にしました。制作途中も何度もアプリを触ってもらい、フィードバックを定期的に反映させました。 結果、シンプルで見やすいUI/UXに出来うる限りこだわることができました。 6. 今後の課題 ・完成はしましたが、本格的な運用を想定した制作は行えていませんでした。 今後は、ただの学習のアウトプットとしてだけではなく、運用を想定した設計が必要だと感じました。 ・ APIにないオリジナル書籍の登録 ・ メールアクティベーション機能 ・ 例外の発生の通知機能 など 7. ポートフォリオ作成を終えた感想 とっても楽しかったです! エラーに詰まりながらも解決する過程は苦しくも楽しく、少しずつアプリが形になっていく達成感は代えがたいものでした。 そして、完成したものを友人に使ってもらい、感想や評価、フィードバックをもらえたことが何よりも嬉しかったです。誰かの課題を解決するサービスを(拙くも)作れたという喜びはひとしおでした。 一方で、己の学習不足で形にできていない部分や課題も多く見えた制作でしたので、今後さらなる学習・アウトプットへの意欲が湧いています。より多くの人に課題を解決できるように、転職活動も頑張ります! 8. おわりに 最後までお読みいただきありがとうございました! 記事への感想・コメント等がありましたら是非お願い致します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】scopeメソッドとクラスメソッドでnilを返す時の挙動が違う

クラスメソッドの場合 class Book def self.published where(published: true) end end Book.published.order(id: :desc) #=> Attendance Load (3.8ms) SELECT `attendances`.* FROM `attendances` WHERE `attendances`.`date` BETWEEN '2022-01-01' AND '2022-01-31' ORDER BY `attendances`.`id` DESC nilの場合はnilが返るのでメソッドチェーンが使えない。 class Book def self.published nil end end Book.published #=> nil Book.published.order(id: :desc) #=> NoMethodError: undefined method `order' for nil:NilClass scopeの場合 class Book scope :published, -> { where(published: true) } end Book.published.order(id: :desc) #=> Attendance Load (3.8ms) SELECT `attendances`.* FROM `attendances` WHERE `attendances`.`date` BETWEEN '2022-01-01' AND '2022-01-31' ORDER BY `attendances`.`id` DESC nilの場合でもallメソッドが実行されるのでメソッドチェーンが使える。 class Book scope :published, -> { nil } end Book.published #=> nil Book.published.order(id: :desc) #=> Attendance Load (3.8ms) SELECT `attendances`.* FROM `attendances` WHERE `attendances`.`date` BETWEEN '2022-01-01' AND '2022-01-31' ORDER BY `attendances`.`id` DESC 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[py2rb] 辞書 の四則演算

はじめに 移植やってます。 ( from python 3.7 to ruby 2.7 ) Dict (Python) 辞書の四則演算が必要らしいのですが、辞書を継承してメソッドを追加しているみたいです。 Hash (Ruby) class H < Hash def initialize self.default = 0 end def +(other) case other when Hash other.each do |k, v| self[k] += v end when Integer || Float self.each do |k, _| self[k] += other end end end def *(other) case other when Hash other.each do |k, v| self[k] *= v end when Integer || Float self.each do |k, _| self[k] *= other end end end end h = H.new h + {'A' => 1} h + {'A' => 1, 'B' => 1} p h # {"A"=>2, "B"=>1} h + 3 p h # {"A"=>5, "B"=>4} h * {'B' => 2, 'C' => 2} p h # {"A"=>5, "B"=>8, "C"=>0} h * 2 p h # {"A"=>10, "B"=>16, "C"=>0} そられしくなりました。 本来であれば交換則で、例えば、Integer * Hashも必要なのですが。 もしかしたら、gemsやnumpy/scipyにあるかもしれませんね。 メモ Python の 辞書 の四則演算 を学習した 百里を行く者は九十里を半ばとす
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[rails]評価点ごと(星ごと)の一覧画面を実装

はじめに ポートフォリオ作成中に、評価された商品について、評価点ごとに商品を表示する機能を実装しようと試みました。 その際、ちょうどいい記事が見つからなかったので今回まとめてみました。 開発環境 ruby '3.0.0' Rails 6.0.3.4 前提 下のような、評価をするためのモデル及びカラムが作成されており、投稿機能まで実装されているものとする。 ユーザが"ガジェット"を投稿するサイトにて、下のようなER図にてgadjet_pointを今回の評価点とする。 今回は、下画像のように10段階評価されたものについて、点数ごとの一覧画面を作成することを目標とする. ルーティング app/models/favorite.rb class Favorite < ApplicationRecord . . . resources :boards do member do get :stars end end end ボードコントローラに"stars"アクションを追加し、"stars"アクションにて、評価点(星の数)ごとの一覧画面を表示する。 ビューの作成 コントローラの前に、"stars"アクションを呼び出すビューを作成します。 今回は、した画像のようにヘッダーメニューから遷移できるようにする。 <div class="dropdown"> <button class="btn btn-secondary dropdown-toggle margin-left20" type="button" id="dropdownMenuButton" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Star </button> <div class="dropdown-menu" aria-labelledby="dropdownMenuButton"> <% i = 10 %> <% until i == 0 do %> <%= link_to "#{i}stars" , stars_board_path(id:i), class:"dropdown-item font-black" %> <% i -= 1 %> <% end %> </div> </div> 繰り返し処理にて、最初に"10"を代入し、繰り返す度に-1する。 stars_board_path(id:i)→starsアクションを実行するパスに"id"を評価点として受け渡すようにする。 コントローラ app/controlles/boards_controlle.rb class Favorite < ApplicationRecord . . . def stars @gadjets = Gadjet.where(gadjet_point: params[:id]) @stars = params[:id] end end Gadjetモデルのデータからgadjet_point(カラム名)が受け渡された評価点(:id)であるものを抽出。 評価点ごとの一覧画面 stars.html.erb <div class="album py-5 bg-light"> <div class="container"> <h1 class="text-center margin-bottom25">星<%= @stars %></h1> <%= render "shared/gajets-list", gadjets: @gadjets %>                #評価点別に抽出した@gadjetsをひとつづつ表示するviewを呼び出し。ここはご自身で作成願います。 </div> </div> 結果、以下の画像のような評価点ごとの一覧画面が作成できる。 終わりに この実装方法は完全オリジナルであり、効率がより良い方法等があると思います。 間違い等がありましたら、コメントにてご指摘お願いいたします。 少しでも参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

通称〇〇本まとめ

ツイッターやサイトで見かける「通称〇〇本」が気になって調べてみました。しかし、まとめられているところを探しきれなかったので自分が見かけたものだけ載せてます。 カピバラ本 #HTML #CSS #Webデザイン #入門 Web制作者にかなりオススメの解説書! HTMLとCSSの今のテクニックを基本からしっかり学べるカピバラ本 徳丸本 #Webアプリケーション #Webセキュリティ 浅居本 #Docker #Docker Compose #入門 チェリー本 #Ruby #入門 宇宙本 #R #入門 プログラミングコンテストやアルゴリズムの本 チーター本 螺旋本 蟻本 プログラミングコンテストやアルゴリズムの本3選、読んでみた感想 最後に 通称が生まれるほど読まれている・親しまれている本なので読んで得すること間違いなしだと勝手に思ってます。 載ってない〇〇本があればコメントをください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]downcaseとsliceメソッドの併用

学習したことのアウトプットとして メソッドの引数に、任意の2つの文字列を指定し、引数に指定された2つの文字列のうち、どちらかがもう一方の文字列の末尾にある場合はTrueを、満たせていない場合はFalseを出力するend_otherメソッドを実装する。 この時、入力された文字が大文字でも小文字でも、同一の文字として処理を行う。   例えば、"abc"と"HiAbc"の文字列を引数とした場合、"HiAbc"の末尾に"abc"という文字が存在しているのでTrueと出力される。 使用するメソッド downcase 大文字を小文字に変換するメソッド # 大文字を含んだ文字列を定義 irb(main):001:0> name = "Hiabc" => "Hiabc" # downcaseメソッドを使用し、小文字に変換 irb(main):002:0> name.downcase => “hiabc” slice 文字列から指定した要素を取り出すことができるメソッド 負の数を指定すると末尾からカウントしてくれる こちらでもう少し詳しく記事にしてます→Stringクラスのsliceメソッド array = "Hiabc" #配列番号(インデックス番号)の-3から-1の範囲の文字列を切り取る array.slice(-3..-1) #=> abc 模範解答 def end_other(a, b) a_down = a.downcase b_down = b.downcase a_len = a_down.length b_len = b_down.length if b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down puts "True" else puts "False" end end 解説 2〜5行目 a_down = a.downcase #aの文字列を小文字に変換して代入 b_down = b.downcase #bの文字列を小文字に変換して代入 a_len = a_down.length #aの文字数を代入 b_len = b_down.length #bの文字数を代入 6行目 b_down.slice(-(a_len)..- 1) == a_down || a_down.slice(-(b_len)..- 1) == b_down 左辺の条件は「bの文字列の末尾〜(aの文字数)分の文字がaの文字列と等しい」かどうか、右辺はその逆。 この二つを「||(または)」の論理演算子を用いて条件付けしている。 あとは条件分岐で出力するものを分ける、といった感じ。   問題はともかく、使用したメソッドがどんなものなのかは覚えておきたいところ     ※補足等ございましたらコメントいただけると幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[py2rb] 仮引数の既定値

はじめに 移植やってます。 ( from python 3.7 to ruby 2.7 ) 仮引数 (Python) def func(a, b=1, c=2, **kwargs): print(a, b, c) func(0, 4, 5) func(0, d=4, c=5) # 0 4 5 # 0 1 5 d=4が実引数の2番目にありますが、辞書扱いとなり仮引数の2番目のbには格納されないようです。 独習Python 330p 仮引数 失敗 (Ruby) def func(a, b=1, c=2, **kwargs) p [a, b, c] end func(0, 4, 5) func(0, d=4, c=5) # [0, 4, 5] # [0, 4, 5] d=4の戻り値である4がbに格納されます。 仮引数 成功 (Ruby) def func(a, b: 1, c: 2, **kwargs) p [a, b, c] end func(0, b: 4, c: 5) func(0, d: 4, c: 5) # [0, 4, 5] # [0, 1, 5] 独習Ruby 387p プロを目指す人のためのRuby入門[改訂2版] 186p 仮引数 成功2 (Ruby) def func(a, b: 1, c: 2, **kwargs) p [a, b, c] end func(0, b: 4, c: 5) func(0, 'd' => 4, c: 5) # [0, 4, 5] # [0, 1, 5] このほうが紛らわしくないかも。 メモ Python の 仮引数の既定値 を学習した 百里を行く者は九十里を半ばとす
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】if → unlessへの書き換え unlessメソッド

※初心者向け ※アウトプット練習の為 開発環境 rails 6.1.4.1 ruby 2.6.5 問題内容 次のif文をunlessというメソッドを用いて書き換えてください。 if a + b > 0 puts "計算結果は0より大きいです" end ヒント unless unlessとはifとは逆で、条件式がfalseの場合に処理が実行されます。 ifを使用した場合 if 条件式 条件式がtrueの時に実行する処理 else 条件式がfalseの時に実行する処理 end unlessを使用した場合 unless 条件式 条件式がfalseの時に実行する処理 else 条件式がtrueの時に実行する処理 end 解答 unless a + b <= 0 puts "計算結果は0より大きいです" end 解説 まず問題のコードについて解説を行います。a + b > 0という式は、「a + b が0より大きいとき」にtrueとなり、その結果endまでの処理が実行され文字列が表示されます。 if a + b > 0 puts "計算結果は0より大きいです" end では、上記のコードのifをunlessに変更したらどうなるかを見てみましょう。 unless a + b > 0 puts "計算結果は0より大きいです" end この場合、「a + b が0より大きい」という条件式がfalseの時に文字列が表示されます。つまり、「a + b が0より大きくないとき」に文字列が表示されます。 しかし、これだと条件式と行いたい処理の内容に齟齬があるため、編集が必要です。 このように演算子を>から<に変更するとどうでしょうか。 unless a + b < 0 puts "計算結果は0より大きいです" end この場合は、「a + b が0より小さい」という条件式がfalseの時、つまり「a + b が0より小さくないとき」に文字列が表示されます。 しかしa + bが0の場合でも、「a + b が0より小さい」という条件式がfalseとなるため文字列が表示されてしまいます。 a + bが0の際に文字列を表示させないようにするには「a + b が0以上のとき」にfalseになる条件式に変更します。下記のような演算子<=を使用したコードとします。 unless a + b <= 0 puts "計算結果は0より大きいです" end
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む