20210609のRubyに関する記事は20件です。

Railsでログイン画面っぽいやつを作る

はじめに これはスキルアップ?のための記録です。 今はこの程度しかできない。という意味を込めて…。 内容はめちゃくちゃなので参考にはならないと思います! 1.Controllerを作成する まずはページを表示するためにコントローラーを作成します。 Railsのアプリケーションフォルダまで移動してコントローラーを作成します。 $cd [アプリケーションフォルダ] $rails g controller login_controller そうするとこのようにコントローラーの中に新しいrbファイルが生成されます。 生成されたコントローラーにアクションメソッドを追加します。 login_controller.rb class LoginController < ApplicationController def login end end これで最低限画面を移すためのコントローラーが完成しました 2.Viewを作成する 続いて、Controllerから呼び出されるViewのファイルを生成します。 次のようなファイルを作成します。 [app>config>>コントローラー名>アクション名.html.erb] このとき、ファイルの拡張子は[.html.erb]を利用します。(そういうルールらしいです。) 中身はログイン画面とフォームとボタンだけ入力しておきます。 login.html.erb <h1>Login画面</h1> <%= form_with url: "login" , method: "get" do |form| %> <div> <%= form.label :ID %><br> <%= form.text_field :id %><br> <%= form.label :PASSWORD %><br> <%= form.text_field :password %><br> <%= form.submit :Login, name: nil %> </div> <% end %> 3.ルーティングを設定する 次はルーティングを設定します。 指定のURLを踏んだ時に、このコントローラーに対応する画面を表示してね!というもの。 場所は[app>config>routes.rb]です。 get "URL名" => "コントローラー名#アクション名" という行を1行追加します。 routes.rb Rails.application.routes.draw do get "login" => "login#login" end これで http://localhost:3000/login にアクセスできるようになりました。 4.正常に画面表示されるか確認 ここまで来たら一度作成した画面が見れるかサーバーを起動してhttp://localhost:3000/loginにアクセスしてみます。 こんな画面が出てくれば成功です。 今のところはログインボタンを押しても同じ画面に遷移します。 5.TOP画面の追加 続いてログインが成功したときの画面を設定します。 まずはログイン画面の次に遷移する画面を作成しましょう。 新しくログインコントローラーにアクションを追加します。 login_controller.rb class LoginController < ApplicationController def login end def top end end 次に表示する画面を作ります。 top.html.erb <h1>Top画面</h1> <%= form_with url: "login" , method: "get" do |form| %> <div> ログイン成功!<br> LoginID:<%= @id %><br> Password:<%= @password %> </div> <% end %> そしてルーティングを設定します。 routes.rb Rails.application.routes.draw do get "login" => "login#login" get "top" => "login#top" end これで http://localhost:3000/top にアクセスできるようになりました。 6.フォームから値を受け取る ログイン機能を実装するには、フォームに入力されたIDとパスワードをコントローラー側で受け取る必要があります。 コントローラーにパラメーターを受け取るように記述します。 railsではparamsで値を受け取り、型は無条件に文字型になるようです。 login_controller.rb class LoginController < ApplicationController def login @id = params[:id] @password = params[:password] end def top end end 続いてこの値を用いて指定のユーザーかどうかを検証します。 今回は適当に作ってるのでユーザーIDとパスワードを固定にしてコントローラーで判定します。 id user password p@ssword IDとパスワードが一致すれば、top画面を表示する というものです login_controller.rb class LoginController < ApplicationController def login @id = params[:id] @password = params[:password] if @id == "user" && @password == "p@ssword" then render template: "login/top" end end def top end end 7.ログインする IDとパスワードを入力してログインボタンを押下! ↓ ログインができました! IDもしくはパスワードを間違えるとLogin画面に戻ってくるはずです! 最後に 前回の環境構築に続き、とりあえず適当に簡単なログイン画面でも作ろう!と思って完成したのがこれでした。 正直めちゃくちゃだなーと思いながらやけくそで書いた感じはあります・・・笑 今後はセキュリティ面やパラメーターの種類、データベースの連携等を勉強してちゃんとしたログイン画面を作れたらいいなーと思っています。 最後までつまらない記事にお付き合いいただきありがとうございました。 今後も少しずつレベルを上げて投稿頑張ろうと思いますのでよろしくお願い致します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】Your Yarn packages are out of date! Please run `yarn install --check-files` to update.と怒られた

はじめに Railsでの環境構築中に起きたエラーを備忘録として残します。 解決方法 サーバーを立ち上げるとyarnがインストールされていないですのような以下のエラーが発生 ターミナル $ rails s => Booting Puma => Rails 6.0.3.2 application starting in development => Run `rails server --help` for more startup options error Couldn't find an integrity file error Found 1 errors. ======================================== Your Yarn packages are out of date! Please run `yarn install --check-files` to update. ======================================== To disable this check, please change `check_yarn_integrity` to `false` in your webpacker config file (config/webpacker.yml). yarn check v1.22.4 info Visit https://yarnpkg.com/en/docs/cli/check for documentation about this command. Exiting あれ?インストールしているはずだけど!と思いながら エラー通りにひとまず以下のコマンドを実行 ターミナル $ yarn install --check-files しかし、解決できず。。。 そこで以下のコマンドで、yarnのインストールではなく アップグレードしてあげることで解消することができました! ターミナル $ yarn upgrade 同じ境遇の方はぜひ試してみてください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ぼっち演算子とtryメソッドの違い

共通点 レシーバがnilの場合は、nilを返す foo = nil foo.try(:bar) #=> nil foo&.bar #=> nil 相違点 レシーバがnilで無く、レシーバが呼び出せないメソッドを呼び出してしまった場合 ぼっち演算子: NoMethodErrorを返す tryメソッド: nilを返す # レシーバが呼び出すこの出来ないbarメソッドを呼び出した場合 foo&.bar #=> NoMethodError foo.try(:bar) #=> nil まとめ 必ずしも、似てはいるけど同じでは無いってことですね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

制御構文 while [Ruby]

while いつもwhile文の利用の仕方を忘れるので、ここに記しておく。 while 条件式 do 実行する処理1 実行する処理2 : end なぜ忘れるのかというと、whileの条件式がtrueの場合ループするのか、falseの場合ループするのか忘れてしまうからである。 そこで、英語の意味を思い出してみた。 (接)while SV:~~の限り、SVする。 これに準じて覚えると、条件式がtrueの限り、ブロック内の処理を繰り返す。 ということになる。Ruby便利〜
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【At Corder】【初心者】ABC049C - 白昼夢 をRuby で解いてみた

はじめに AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~ - Qiita こちらの記事を参考に初心者がAt corderに挑戦します。 目的としては、就職活動でのコーディングテスト対策です。 毎日1問を目標としてコツコツやってきます わからないことは調べる精神です。ちょっとでもわからないなぁ、と思ったことは調べて解説と参考文献を載せますので、同じ内容でわからない人がいれば参考にししてください 問題文 文字列$S$は空文字列$T$の末尾に dream dreamer erase eraser のいずれかを追加して、$S = T$が成立するか判定せよ。 制約 $1≤|S|≤10^5$ $S$は英小文字からなる。 入力 S 出力 $S=T$とすることができる場合は YES をそうでない場合は NO を出力 入力例 erasedream 出力例 YES erase dream の順で$T$の末尾に追加することで$S=T$とすることができる。 回答 s = gets.chomp s = s.gsub(/eraser/,"").gsub(/erase/,"").gsub(/dreamer/,"").gsub(/dream/,"") puts s.length == 0 ? "YES" : 'NO' gsubを使う場合、()の中は正規表現じゃないとだめみたいなので注意。(最初配列を使ってeachで文字を順繰り消去しようとしたが、うまくいかなかった) 他の方の回答では、each、chom!メソッドを使って、末尾から消去していく方法もありました。 また、正規表現を使うと puts gets.match(/^(dream|dreamer|erase|eraser)+$/)? "YES" : "NO" と1行で表せてしまいます。 感想 今回は難しかったです。自力で解くことはできませんでした・・! いろんな方の回答例を参照させていただいて形にしました。かなり勉強になりました? 初めて正規表現を使ってみました!使えるようになるまで結構時間がかかりましたが、これを格好良く使いこなせる様になりたいですね。 参考文献 Rubyで指定した文字列が含まれるか確かめる方法を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン 【Rubyの正規表現!】基礎の基礎から応用まで徹底解説! | 侍エンジニアブログ はじめてのRuby!matchメソッドで正規表現によるマッチング | 侍エンジニアブログ AtCoder に登録したら解くべき精選過去問 10 問を Ruby のメソッドチェーンで解いてみた - Qiita [Atcoder]ABC049C - 白昼夢 / Daydream[Ruby]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]select,select!で配列やハッシュを抽出する

はじめに Ruby学習者です。 本記事はselectを使って配列を抽出したものです。 破壊的メソッドのselect!についても記述します。 以下公式ドキュメントです selectの使用例 1.配列の場合 ※ even?はレーシバーが偶数の場合にtrueを返すメソッドです list = [1,2,3,4,5] list = list.select { |num| num.even? } p list => [2, 4] 2.ハッシュの場合 hash = { "a" => 1, "b" => 2, "c" => 3 } hash = hash.select {|k,v| v.even? } p hash {"b"=>2} select!の使用例 selectには破壊的メソッドselect!も用意されています。 破壊的メソッドはオブジェクトそのものを変更するものなのでlist=で代入する必要がなくなります。 1.配列の場合 list = [1,2,3,4,5] list.select! { |num| num.even? } p list => [2, 4] 2.ハッシュの場合 hash = { "a" => 1, "b" => 2, "c" => 3 } hash.select! {|k,v| v.even? } p hash {"b"=>2} 応用 selectを応用した、例を記述していきます。 list = ["tokorozawa", "yamada", "oyama", "yazawa"] list.select! { |x| x.include?("zawa") } p list => ["tokorozawa", "yazawa"] list = [1,2,3,4,5] list.select! { |num| num > 3 } p list => [4, 5] まとめ selectを使うと配列やハッシュを抽出できる 他のメソッドと組み合わせるとさまざまなデータ処理ができる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ransackで外部キーをつけているテーブルをソートする

はじめに Ransackを使ってソート機能を実装する際にうまく行かず、検索してもあまり出てこなかったのでまとめておきます。 Ransackとは RansackはRuby on Railsの検索機能を実装する際のGem(ライブラリ)です。 Railsで検索機能をつけるとしたらまず候補に上がるGemのRansack。 検索機能を簡単に実装できますが、テーブルのソート機能も簡単に実装できます。 ransackのインストール gem 'ransack' # Gemfileに追加して $ bundle install # bundle installしたら使えます。 Ransackの検索機能についてはこちらをみるとわかりやすいです。 Pikawaka【Rails】 ransackを使って検索機能がついたアプリを作ろう! Ransackでソート機能を実装する。 Ransackでソート機能を実装するにはsort_linkを使うと簡単に実装できます。 基本的なソート機能の実装はこう記述します。 ソートの構文 <th><%= sort_link(@q, :ソートしたいカラム名, "表示させたい名前" )%></th> 今回はこんなテーブル(表のこと)を例にしてみます。 index.html.erb <table> <thead> <tr> <th>ID</th> <th>名前</th> <th>本の名前</th> </tr> </thead> <tbody> <% @results.each do |user|%> <tr> <td><%= user.id %> <td><%= user.name %> <td><%= user.book.book_name%></td> </tr> <% end %> </tbody> </table> Usersテーブル カラム名 id name book_id Booksテーブル カラム名 id book_name 単純なソート機能 ソート機能実装① <thead> <tr> <th><%= sort_link(@q, :id, "ID" )%></th> <th><%= sort_link(@q, :name, "名前")%></th> </tr> </thead> これだけでidとnameでソート機能が実装できます。 それではUsersテーブルとアソシエーションを組んでいるbooksテーブルがあるとして、booksテーブルのbook_nameカラムをテーブル(表のこと)に表示させていた場合に、ソートするにはどうしたらいいでしょうか? アソシエーションを組んでいる別テーブルのカラムのソート 最初に単純にbook_nameと入れてみます。 ソート機能実装② <thead> <tr> <th><%= sort_link(@q, :id, "ID" )%></th> <th><%= sort_link(@q, :name, "名前")%></th>       <th><%= sort_link(@q, :book_name, "本の名前")%></th> </tr> </thead> しかし、これではソートの矢印は表示されますがソートされません。 アソシエーションを組んでいるテーブルでソートするにはこうします。 アソシエーション組んだカラムのソート構文 <th><%= sort_link(@q, :子テーブル名_カラム名, "表示させたい名前")%></th> アソシエーションを組んでいるテーブルの名前(単数)に"_"アンダーバーを入れて記述します。 この場合テーブル名にアンダーバーが入ったり、カラム名にアンダーバーが入ったりすることもあると思いますが大丈夫です。 先程のコードを修正してみます。 ソート機能実装② <thead> <tr> <th><%= sort_link(@q, :id, "ID" )%></th> <th><%= sort_link(@q, :name, "名前")%></th>       <th><%= sort_link(@q, :book_book_name, "本の名前")%></th> </tr> </thead> これでbook_nameもソートできるようになりました。 中間テーブルを挟んだ際のソート 中間テーブルを挟んだ孫テーブルのカラムをテーブル(表のこと)に表示させていて、それをソートしたいということがあると思います。 その際はこのように記述すればソートすることができます。 中間テーブルを使った時のソート構文 <th><%= sort_link(@q, :子テーブル名_孫テーブル名_カラム名, "表示させたい名前")%></th> 終わりに 管理画面などで一覧表示させてソートさせて、検索したいということは多々あると思います。 その際に参考になれれば嬉しいです。 参考サイト -Qiita Ransackのsort_linkで孫テーブルの値でソートする
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

railsにbootstrap導入

1.gemに記入 gem 'bootstrap', '~> 4.1.1' gem 'jquery-rails','~>4.3.1' ↓ 2.ターミナルでコマンド入力 bundle install ↓ 3.ターミナルでコマンド入力(cssをscssに変更) mv app/assets/stylesheets/application.css app/assets/stylesheets/application.scss ↓ 4.application.scssの中に下記を記入 @import "bootstrap"; ↓ 5.assets/javascripts/application.jsの中の //= require_treeの前に下記記入 //= require jquery3 //= require popper //= require bootstrap-sprockets
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

個人的にrailsのformで一番わかりやすい記事(メモ)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】logに特定の文字列がある時、ログレベルを変更する

config/environment.rb にて以下を記述する。 require_relative 'application' Rails.application.initialize! class Logger class Formatter def call(severity, time, progname, msg) if msg.include?("No route matches") severity = "ERROR" end msg = msg.gsub(/^\n/, "") end end end 解説 ここで出てきた引数の msgは logメッセージ serverity はログレベル したがって上記の場合、「"No route matches" がメッセージに含まれるlogはERROR」 に変更される。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby on Rails】ActiveRecord::Relation に対して present? や blank? メソッドを使用していたら性能低下していた話

はじめに これは私が ActiveRecord::Relation に対して present? や blank? メソッドを使用したら API サーバが機嫌を悪くしてレスポンスを返してくれなくなったので、なんで機嫌を損ねたのかを共有するための記事です。 なんで機嫌を損ねたの? さていきなり本題です。なぜ API サーバが機嫌を悪くしたのか?それを解き明かすために、まずは ActiveRecord::Relation に対して present? や blank? メソッドを使用するとどのような流れで ActiveRecord::Relation が存在しているかを評価するのか確認しましょう。評価の流れは大まかに以下の流れで実行されます。 格納している条件を元にクエリを発行 クエリ実行結果をメモリにロード 存在チェック はい、ここで感の良い皆様なら既にお気づきでしょう。問題なのは「2. クエリ実行結果をメモリにロード 」の部分です。結果が何百万レコードもあるクエリを発行すると「2. クエリ実行結果をメモリにロード 」で API サーバーがお腹いっぱいにも関わらず、更にデータをお腹に詰め込もうとします。鬼畜ですね。私も同じことされたら機嫌を悪くするどころじゃ済まないです。 ということでデータ件数が膨大になりそうな ActiveRecord::Relation に present? や blank? を使用するのはやめて API サーバーと仲良くしていきましょうというお話でした。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【 Bootstanp 】Ruby on RailsでBootstampを使用する方法

はじめに 今回はRuby on RailsでBootstampを使用する方法について書かせていただきます。 BootstampやRuby on Railsについては下記のHPをご覧いただければと思います! (こちらの記事ではrailsのインストール方法などは割愛させていただきます) ・Bootstampについて https://getbootstrap.jp/docs/5.0/getting-started/introduction/ ・Ruby on Railsについて https://railsguides.jp/ 開発環境 Bootstamp バージョン5 Ruby on Rails バージョン2.6.5 使用するための準備 ①Railsをインストール後、テキストエディタを開き下記のファイルを開く app / views / layouts / application.html.erb ②application.html.erbを開くと元から下記のように記述があるのを確認する application.html.erb <!DOCTYPE html> <html> <head> <title>アプリ名</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> <%= yield %> </body> </html> ③Bootstampを使用するために下記の二つの記述を追加する ⑴ headタグの中にBootstampのためのCSSの記述 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> ⑵bodyタグ内にBootstampのJavaScriptを読み込むための記述 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script> ※こちらは <%= yield %> の下に記述をする 完成形 application.html.erb <!DOCTYPE html> <html> <head> <title>アプリ名</title> <%= csrf_meta_tags %> <%= csp_meta_tag %> ※追加 <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-giJF6kkoqNQ00vy+HMDP7azOuL0xtbfIcaT9wjKHr8RbDVddVHyTfAAsrekwKmP1" crossorigin="anonymous"> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %> </head> <body> <%= yield %>   ※追加 <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta1/dist/js/bootstrap.bundle.min.js" integrity="sha384-ygbV9kiqUc6oa4msXn9868pTtWMgiQaeYH7/t7LECLbyPA2x65Kgf80OJFdroafW" crossorigin="anonymous"></script> </body> </html> これで問題なく、Bootstampが動きます!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

該当のファイルを削除した時のdb削除方法

ファイルに該当するデータベースを削除し忘れて、先にファイルを削除してしまいました。 ターミナルでのrails db:dropコマンドは該当のディレクトリ上でしか機能したいため、この場合は使用できません。 git cloneして該当のファイルを蘇らせることに。その上でrails db:dropを行いデータベースを削除しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

$ rails generate 実行時、rubyのCPU使用率が100%になる

原因 どうやらlisten gemがBigSurをサポートしていないというバグが原因らしい。 Pegging CPU core on Apple M1 processor #636 解決策 Gemfileのlisten gemのバージョンを3.3.0以降のものに指定すればよい。 Gemfile group :development do gem 'web-console', '4.0.1' gem 'listen', '>=3.0.5', '<4.0' gem 'spring', '2.1.0' gem 'spring-watcher-listen', '2.0.1' end 追記 ↓teratailのこちらの記事のやり方でも良さそうです。 railsのspringが暴走し、rubyがCUPを大きく消費する
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rbenv globalしてもrubyバージョン変わらない

https://qiita.com/opiyo_taku/items/3312a75d5916f6cd32b1 https://qiita.com/1000ch/items/a61e65fe82d8bdea840e rbenvバージョン確認 rbenvバージョン確認 $ rbenv -v rbenv 1.1.2 Rubyバージョン指定してインストール $ rbenv install 2.5.1 システム全体で使用するRubyのバージョンを設定 $ rbenv global 2.5.1 設定したバージョンのRubyになっているか確認 $ ruby -v ruby 2.6.3p62 (2019-04-16 revision 67580) [universal.x86_64-darwin19] 切り替わっていない… rbenvのRubyバージョン確認 $ rbenv versions system * 2.5.1 rbenvでは2.5.1になっているのに、なんでrubyのバージョンは2.6.3のままなんだ。 参照先を確認 $ which ruby /usr/bin/ruby rbenvでRubyをインストールすると /.rbenv/shims/ruby って場所にあるらしい。 だから参照先を切り替える必要がある。 /.rbenv/shims/ruby にパスを通すようにする。 参照先を変更 rbenvにパスを通す $ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile $ echo 'if which rbenv > /dev/null; then eval "$(rbenv init -)"; fi' >> ~/.bash_profile $ source ~/.bash_profile $ rbenv global 2.5.1 $ ruby -v ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19] $ source ~/.bash_profile 変更したことをPCに反映させる Rubyのバージョンは変更できたけどパスを通すってなんだ ? ? ?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ActiveHashのデータを使ってプルダウン検索する機能

今回オリジナルアプリの作成で、投稿したコンテンツをジャンル別に表示する機能を調べて実装できたのでここに記録。 こちらもransackというgemを導入することで実装できた。 ransackは複雑な検索機能を可能にするgemで、今回は実装しなかったがソート機能も可能 Gemfileにgem "ransack"と記載 ターミナルでbundle install 次に新しいアクションをルーティングに設定するためにroutes.rb get '/movie/genre', to: "movies#genre" genreアクションが実行されると、ジャンル検索結果のページが表示されるように設定。 controllerにbeforeアクションを設定  before_action :search_genre_movie, only: [:index, :genre]  (省略) private def search_genre_movie @q = Movie.ransack(params[:q]) end privateメソッドにsearch_genre_movieメソッドを作成。これを実行すると、@q = Movie.ransack(params[:q])という検索オブジェクトが作成される。 次にアクションの定義 def genre @movies = @q.result genre_id = params[:q][:genre_id_eq] @genre = Genre.find_by(id: genre_id) end genreメソッド内に@movies = @q.resultを記入し、検索結果を取得。この時、binding.pryでparams[:q]にはcategory_id_eqの中にidが入っていることを確認。 次に検索ボックスを作成 今回はindex.html.erbに記載 <%= search_form_for @q, url: photo_category_path do |f| %> <%= f.collection_select :category_id_eq, Category.where.not(id: 0), :id, :name, include_blank: "カテゴリー検索" %> <%= f.submit '検索' %> <% end %> ransackのヘルパーメソッドsearch_form_forメソッドで、検索フォームを作成。引数に検索オブジェクト@qを渡し、urlのパス名はgenreアクションのパス名(rails routesで確認を)。 パスの指定が完了したので次は実際に検索を行なった後のビューの作成 今回はgenre.html.erbにindex.html.erbと同様のビューに設定。 <ul class='movie-lists'> <%@movies.each do |movie| %> <% if current_user.id == movie.user_id %> <li class="movie-contents"> <div class="box-movie-genre"> <%=movie.genre.name%> </div> <%= link_to movie_path(movie.id), class:"link" do %> <div class="box-movie-image"> <%= image_tag movie.image, size: '200x210',class: "movie-img" %> </div> <div class="box-movie-title"> <%= movie.title %> </div> <%end%> </li> <%end%> <%end%> </ul> これでプルダウン検索機能実装 補足情報として、3行目のif文に関しては、今回各ユーザーが他者の投稿内容は一切閲覧できない使用にするため。検索で得たgenre_idを持つmoviesの中から、現在のユーザーと投稿したユーザーが同一であれば表示するという条件で表示。こうすることで異なるユーザーの投稿は表示されない。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby クラスとインスタンスの概念を使用したコードの記述

問題 class Archive def initialize(name, title, content) @name = name @title = title @content = content end end 上記のコードに追加を行い、以下の出力結果を得られるようにしてください。ただし、クラスとインスタンスを使用するものとします。 チャンネル名: Nene Ch.桃鈴ねね タイトル: 【 #桃鈴ねね3D 】?桃鈴ねね3Dお披露目!?【ホロライブ/桃鈴ねね】 本文: ホロライブ5期生オレンジ担当、桃鈴ねねです?  回答 class Archive def initialize(name, title, content) @name = name @title = title @content = content end def name @name end def title @title end def content @content end end archive = Archive.new("Nene Ch.桃鈴ねね", "【 #桃鈴ねね3D 】?桃鈴ねね3Dお披露目!?【ホロライブ/桃鈴ねね】", "ホロライブ5期生オレンジ担当、桃鈴ねねです?") puts "チャンネル名": #{archive.name}" puts "タイトル: #{archive.title}" puts "本文: #{archive.content}" 解説 def name @name end これで@nameというインスタンス変数の宣言。 変数は該当のメソッド、クラス外では使用できないので、 def initialize(name, title, content) @name = name @title = title @content = content end にて@name,@title,@contentがある以上、それぞれインスタンス変数を宣言しなければいけない。 archive = Archive.new("Nene Ch.桃鈴ねね", "【 #桃鈴ねね3D 】?桃鈴ねね3Dお披露目!?【ホロライブ/桃鈴ねね】", "ホロライブ5期生オレンジ担当、桃鈴ねねです?") この部分でArchiveというクラスにて.newメソッドを使用して、インスタンス変数の生成。 この時のname,title,contentはそれぞれ()で記述しているものが格納される。 puts "チャンネル名": #{archive.name}" 最後出力。 変数を文字列として出力したい場合は#{}で記述する。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Qiita初投稿

7月からRUNTEQに入学します。 ProgateのRuby、Ruby on railsをやったあと ゼロからわかるRuby入門と現場レイルズを取り組みました。 しかしまだRubyもRailsもあまりわかっていない状況… 入学まで1ヶ月あるので参考書を繰り返して理解を深める。 間に合えばRailsチュートリアルもやりたいな。 学習記録のために作成。 Qiitaの使い方わからんが、使いながら慣れて行こう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

NKODICEシミュレーターを実装してみた

動機 NKODICEというゲームがある どういったゲームなのかはこの記事を読んで感じ取ってほしい。 分かったと思うので、Rubyで簡易的なシミュレータを実装してみる。 実装方針 小便は考慮しない(プロのNKODICEプレイヤーは小便しないので) NUDGEはリロール相当の効果があるものとする(プロのNKODICEプレイヤーは少なくともNUDGEを無駄遣いしないので) wordが完成しない場合、NUDGEする(ライフで受ける戦略や、完成wordが期待よりしょぼかった場合もNUDGEする戦略もあるが、今回はこの実装で行く) Qiitaの規約の回避 NKODICEで用いられる東洋の神秘的な文字列は、何故かQiitaの規約に抵触してしまう可能性がある この問題は出力にsortをかけることで回避できる。 > 5.times.map{%w(ん こ う ま ち お).sample}.sort.join => "おちちんん" また、sortすることにより役判定の高速化が望める。 実装 nkodice.rb def solve(kotodama) face_list = kotodama.chars word_list = [] if (kotodama.match(/う.*ち.*ん/)) word_list<<"うちん" end if (kotodama.match(/う.*こ.*ん/)) word_list << "うこん" end if (kotodama.match(/お.*こ.*ま.*ん/)) word_list << "おこまん" elsif (kotodama.match(/こ.*ま.*ん/)) word_list << "こまん" end if (kotodama.match(/こ.*ち.*ん/)) word_list << "こちん" end if (kotodama.match(/お.*ちち.*んん/)) word_list << "OCHICHINN" elsif (kotodama.match(/ちち.*んん/)) word_list << "ちちんん" end tripile_list = %w(ん こ う ま ち お).each_with_object([]) do|c,memo| m = kotodama.match(/#{c}{3,}/) memo << [c, m[0].size] if m end [face_list, word_list, tripile_list] end life = 3 dice_num = 5 nudge_num = 5 score = 0 roll = 0 word_combo = {} loop do break if life == 0 life -= 1 roll += 1 print "ROLL:#{roll} life: #{life} nudge:#{nudge_num} dice:#{dice_num}\n" (face_list, word_list, tripile_list) = [nil,nil,nil] loop do kotodama = dice_num.times.map{%w(ん こ う ま ち お).sample}.sort.join (face_list, word_list, tripile_list) = solve(kotodama) if word_list.size == 0 && nudge_num > 0 nudge_num-=1 print "nudge!(left: #{nudge_num})\n" next end break end life += 1 if word_list.size >= 1 dice_num = 5 dice_num += word_list.size - 1 if word_list.size >= 2 nudge_num += word_list.size score += face_list.sum{|c| {"ん"=>50,"こ"=>100,"う"=>500,"ま"=>500,"ち"=>500,"お"=>300}[c] } word_list.each{|w| base_point = {"うちん"=>1000,"うこん"=>1000,"おこまん"=>5000,"こまん"=>1000,"こちん"=>1000,"OCHICHINN"=>10000,"ちちんん"=>3000}[w] score += base_point * 2**[word_combo[w]||0, 3].min dice_num = 10 if w == "OCHICHINN" } word_combo = word_list.map{|w| [w, (word_combo[w] || 0) + 1] }.to_h tripile_list.each{|c,n| base = {"ん"=>-3,"こ"=>1.5,"う"=>2,"ま"=>2,"ち"=>2,"お"=>1.5}[c] score *= (base + (base > 0 ? 1 : -1) * (n-3)).clamp(-4,4) score = score.abs if c == "ん" } print "score: #{score}\twords: #{word_list}\n" end print "gameover\n" print "score: #{score}\n" 動作結果 実行してみる。 停止しないんだが?? 考察 操作を繰り返した際、長期的に見て 「消費するNUDGE」=<「得られるNUDGE」が成り立つならば、 終わりなくダイスを振り続けることができると思われる。 5個のダイスを振ったとき、wordが完成する確率は約41%である 1個以上のwordが完成した際得られるNUDGEの数は平均は約1.58個である このとき、「1個以上のwordが完成するまでNUDGEし続けた場合に失うNUDGEの数の期待値」は約1.43個になり、 「消費するNUDGE」=<「得られるNUDGE」が成り立つ。 したがって、wordが1つ以上完成するまでNUDGEし続けるという戦略をとった場合、 十分な数のNUDGEが残っているという仮定の下ではNUDGEは長期的には増えていくことが予想され、ゲームは停止しなくなる。 実際はダイスの数が増える要素もあるので上の計算より高速にNUDGE数は増えるだろう。 > a=%w(ん こ う ま ち お).repeated_permutation(5).map{|kotodama|solve(kotodama.sort.join)[1].size} # wordが完成する確率 > a.select{|x|x!=0}.size.to_f/a.size => 0.411522633744856 # 役が完成した際得られるNUDGEの数の平均 > b = a.select{|x|x!=0} > b.sum(0.0)/b.size => 1.58125 # 1個以上のwordが完成するまでNUDGEし続けた場合に失うNUDGEの数の期待値 > (0..1000).sum{|i| i*(0.59**(i)*0.41) } => 1.4390243902439022 結論 プロではない人間がNKODICE遊ぶ際、ゲームが終了するのは運や長期的な収束の結果ではなくプレイヤーの力量が原因である可能性が高い 練習しろ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails でアプリ作成時に[Sprockets::DoubleLinkError in Users#new] エラーが出た時の対処!

はじめに RailsでCRUD処理を実装している時のことです。 いざコードを書きrails sでサーバーを開こうとした時、いきなりエラーが発生。 初めて見たエラーコードで何故なったのか悩みましたが無事解決できたので記事にしていきます。  原因はかなり単純なことでした。 エラーコード Sprockets::DoubleLinkError in Users#new Sprockets::DoubleLinkError in Users#new Showing /Users/motoki/Desktop/crud_sample/app/views/layouts/application.html.erb where line # raised: Multiple files with the same output path cannot be linked ("users.css") In "/Users/motoki/Desktop/crud_sample/app/assets/config/manifest.js" these files were linked: - /Users/motoki/Desktop/crud_sample/app/assets/stylesheets/users.css - /Users/motoki/Desktop/crud_sample/app/assets/stylesheets/users.scss DoubleLinkErrorと出ています。エラーコードを見ると5、6行目で確かにパスが被っています。 ですが何故こうなったのでしょうか。ターミナルのログを見てみるとrails g controller users実行の際に /Users/motoki/Desktop/crud_sample/app/assets/stylesheets/users.scssは作成されていました。こちらは普段から自動で作成されているので、必要ない方は/Users/motoki/Desktop/crud_sample/app/assets/stylesheets/users.cssと分かりました。 こちらファイルを削除してサーバーを立ち上げると無事アクセスできました。 解決策 /Users/motoki/Desktop/crud_sample/app/assets/stylesheets/users.css 重複してしまっていたこちらのパスのファイルを削除するだけです。 なぜこうなったのか 初めはstylesheetsなんか触った覚えはないのに何故なったのか全然分かりませんでした。 色々と調べていくうちに、VScode に watch sass という機能があるらしいことを知り、色々と見ていると VScode を開くと下にある青色のバーのところに watch sass と書いてあるところが!! そこを押すとwatching...となりcssファイルが作成されました。 いつインストールした機能なのか覚えておらず、普段使わないので知らない間に押していたみたいです。 まとめ  Rails アプリでは使用しないそうなので皆さんもご注意ください。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む