20210911のRubyに関する記事は15件です。

9.11振り返り #オブジェクト

new画面で入力データが、show画面で違うデータを持ってくる idが違う ∵パスの記載順が違ってた _path(@patient,@record) def show : #redirect_to staff_patient_record_path(@record,@patient) :エラー ↓↓↓↓↓↓↓↓↓↓↓ ↓↓↓↓↓↓ここ変えた↓↓↓↓↓    redirect_to staff_patient_record_path(@patient,@record) end routes.rbでルーティングを確認すると /staff/patients/:patient_id/records/:id(.:format) patients/:patient_id  と records/:id がこの順番で必要 ターミナル Prefix Verb URI Pattern Controller#Action staff_patient_record GET /staff/patients/:patient_id/records/:id(.:format) staff/records#show      ↓↓↓↓↓                               ↓↓↓↓↓↓                                                        先 patients/:patient_id 次 records/:id                                                                                             ↓↓↓↓↓↓↓↓↓↓↓ redirect_to staff_patient_record_path(@patient,@record) ほしいルーティングを限定指定する :rails routes | grep ほしい名前 enumの書き方 enum カラム名:{"選択肢":"表示させたい文字","選択肢":"表示させたい文字",,} models/-.rb enum カラム名:{"選択する":"表示させたい文字"} enum adjacent: { "acceptable":"問題なし""erythema":""びらん,"erosion":"水疱膿疱"}, _prefix: true オブジェクトの定義   と enumの書き方2 enum adjacent: { "acceptable":0,"erythema":1,"erosion":2,"blister":3,"ulceration":15}, _prefix: true 整数値部分を取りたい場合    {{カラム名}}_before_type_cast で持ってくる config/locales/ja.ymlファイルで日本語化しておく show画面では @record.barrier_i18n のように_i18nで呼び出す models/-.rb enum adjacent: { "acceptable":0,"erythema":1,"erosion":2,"blister":3,"ulceration":15}, _prefix: true enum barrier: {"acceptable":0,"erythema":1,"erosion":2,"blister":3,"ulceration":15}, _prefix: true #オブジェクトをpointとしてをここで定義する # {{カラム名}}_before_type_cast 整数値部分を持ってこれる def point adjacent_before_type_cast + barrier_before_type_cast end config/locales/ja.yml ja: record: adjacent: acceptable: 障害なし erythema: 紅斑 erosion: びらん blister: 水疱・膿疱 ulceration: 潰瘍・組織増大 barrier: acceptable: 障害なし erythema: 紅斑 erosion: びらん blister: 水疱・膿疱 ulceration: 潰瘍・組織増大 show.html.erb #_i18nで日本語化できる <th>B:皮膚保護剤部:皮膚保護剤が触れていた範囲</th> <td><%= @record.barrier_i18n%></td> undefined method `id'エラー ∵ログインしていない&バリテーションまだかけてない 下の部分でエラー  patientがnillになる @dialy.patient_id = current_patient.id
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Thinreportsでの帳票作成をより手軽に

rubyで手軽に帳票が作成できるThinreports Thinreportsを使用した帳票作成ステップは以下の通りです。 Thinreports-editorでレイアウトファイルを作る rubyで レイアウトの各項目に値を設定 generateメソッドでPDFを出力 今回はレイアウトファイルの情報を利用して各項目への設定ロジックのひな型を作成します。 レイアウトファイル(.tlf)はJSON Thinreports-Editorで作成されるレイアウトファイルはJSONなので、 情報を取り出してみます。 レイアウトファイルの構造(の雰囲気)は以下の通りです。 items item id type "text-block" item id type "list" items detail items item 今回のお題として簡単な帳票(collection_list.tlf)を作成しました。 tlfから情報を取り出そう(1) text-block 可変テキストを設定するのはtype: text-block なので、このIDを取り出します。 require 'json' @layout="collection_list.tlf" File.open(@layout) do |j| tlf = JSON.load(j) @text_blocks = [] tlf["items"].each do |item| if item["type"] == "text-block" @text_blocks.push item["id"] end end @text_blocks.each do |i| puts i end end 実行してみます。 PS thinreports> ruby .\extract_text_block.rb name birthday まずはベタなtext-blockのIDが取り出せました。 tlfから情報を取り出そう(2) listのtext-block 次にリストの中のtype: text-block を取り出します。 リストの項目は取り扱いを変えたいので別の配列に格納します。 require 'json' @layout="collection_list.tlf" File.open(@layout) do |j| tlf = JSON.load(j) @text_blocks = [] @list_text_blocks = [] tlf["items"].each do |item| if item["type"] == "text-block" @text_blocks.push item["id"] end if item["type"] == "list" item["detail"]["items"].each do |l_item| if l_item["type"] == "text-block" @list_text_blocks.push l_item["id"] end end end end @text_blocks.each do |i| puts i end @list_text_blocks.each do |i| puts i end end PS thinreports> ruby .\extract_text_block.rb name birthday item_name date shop リストの中のtext-blockもOKです。 erbでrubyソース生成 ではソース生成に参りましょう。 erbを作成します。 リスト内のtext-blockはCSVを読み込んで値を設定するように組みました。 require 'thinreports' require 'csv' Thinreports::Report.generate filename: 'result.pdf', layout: '<%= @layout %>' do start_new_page % @text_blocks.each do |item| page.item(:<%= "#{item}" %>).value = "" % end CSV.foreach("data.csv") do |csv_row| page.list.add_row do |row| % @list_text_blocks.each_with_index do |l_item,i| row.item(:<%= "#{l_item}" %>).value = csv_row[<%= "#{i}" %>] % end end end end rubyにはerbでの生成ロジックを追加 require 'json' require 'erb' @layout="collection_list.tlf" # 省略 erb = ERB.new(IO.read("./extract_text_block.erb"), nil, "%" ) File.open("./src.rb", "w" ) { |f| f.write( erb.result(binding) ) } 実行するとこんなソースが生成されました。 require 'thinreports' require 'csv' Thinreports::Report.generate filename: 'result.pdf', layout: 'collection_list.tlf' do start_new_page page.item(:name).value = "" page.item(:birthday).value = "" CSV.foreach("data.csv") do |csv_row| page.list.add_row do |row| row.item(:item_name).value = csv_row[0] row.item(:shop).value = csv_row[1] row.item(:date).value = csv_row[2] end end end さあ、PDFの時間だ データとなるdata.csvを用意して(ヘッダは要りません) アイテム ショップ 日付 タイタン ○○屋 197X スパイマジシャン △△屋 197X コマンド □屋 197X src.rbを実行すると・・・! 一部設定してないところもありますが、簡単にPDFが作成できました。 コーディングだけでなくドキュメント作成等にも応用できると思います。 (ドキュメント作成は標準装備されてます) テンプレート処理は面白いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby 3.1 で { a: a } が { a: } とかけるようになったらしい

ブログ記事からの転載です。 以前から山のように提案があった Hash のショートハンドが RubyKaigi の感想戦で matz を説得して入ったらしい。 チケット:[Feature #14579] Hash value omission コミット:https://github.com/ruby/ruby/commit/c60dbcd1c55cd77a24c41d5e1a9555622be8b2b8 感想戦のログ:https://hackmd.io/Mmse5ybASq-6c2kQoJQdMQ これによって Ruby 3.1 で Hash が以下のように書くことができます。 name = "homu" age = 14 # { name: name, age: age } のシンタックスシュガー { name:, age: } # => {:name=>"homu", :age=>14} # 一部だけ値を割り当てることもできる { name:, age: 16 } # => {:name=>"homu", :age=>16} def tokyo "東京" end # メソッド呼び出しも可能 { tokyo: } # => {:tokyo=>"東京"} def user(name:, age:) { name:, age: } end # user(name: name, age: age) になる user(name:, age:) めっちゃ便利ですね!!!! このショートハンドは { a: } -> { a: a } になるというよりかは a: -> a: a になる、と認識するとよさそうです(なので [a:] -> [a: a] となる。 matz を説得している時にちょうど離席していたのでどのような経緯で matz を説得したのかがすごく気になる…。 既に本体にコミットされているので rbenv install 3.1.0-dev などで最新の Ruby を落としてくるとすぐに使えます。 今すぐ早く使いたい。 おまけ 感想戦で binding.local_variable_get(:if) の変わりに {if:}[:if] が使えるようになると言及されててワロタ def foo(if:) # if はキーワードなので変数にアクセスする時は Binding#local_variable_get を使う必要があった if_ = binding.local_variable_get(:if) # このショートハンドを使うとこうかけるようになる if_ = {if:}[:if] end 便利そう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

よく間違えるコマンド

Mysqlの接続 mysql -u root -p -h rds-mysql-server.xxx.ap-no-1.rds.amazonaws.com mysql -u root -p -h  「RDS→データベース→エンドポイントのrdsで始まるとこ」 EC2接続 ssh -i ~/.ssh/practice-aws.pem ec2-user@xx.xx.xx.xx ssh -i ~/.ssh/practice-aws.pem ec2-user@「パブリックIPアドレス ipv4のこと」 viの操作 $ sudo vi ファイル名 で操作 $ sudo nginx -t でどこがエラーかわかる :w で保存 :q!  で脱出 :set number で行数わかる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

複数ページの画面遷移を構築しよう!

title: 2-2. HTMLの基本 tags: HTML author: GeekSalon 今回の学習 2-1. HTML/CSSの概要 2-2. HTMLの基本 2-3. CSSの基本 2-4. ホームページの大枠を作ろう! 2-5. 自己紹介サイトを作ろう! 2-6. HTML/CSSをマスターしよう! 2-7. JavaScriptの基本 2-8. jQueryというライブラリを使ってみよう! GOAL HTMLのボタンで画面遷移用のリンクを作成する方法について学ぶ。 使い方理解して、プログラム作成に活かすことができる。 1.HTMLのボタンでリンクを作成する方法は3種類 HTMLのボタンでリンクを作成する方法として、3種類のタグを利用した作成方法をご紹介していきたいと思います。 aタグ aタグにCSSで装飾し、ボタンの様に見せる方法です。 後述する「button」タグや「input」タグと異なり、テキスト形式の表示となるため、CSSでの装飾は必須となります。 aタグでは文章だけではなく、画像などの要素になるものもリンクにさせることができます。 buttonタグ HTMLのbuttonタグは、Webサイト上に「ボタン」を表示させます。 「ボタン」を押すことで、画面遷移やフォーム情報の送信などが可能となります。 inputタグ inputタグは「type」属性に「submit」または「button」値を設定することで、ボタン表示可能になります。 「submit」値は、フォームに入力された値を送信することを目的として実装されます。 リンク用のボタンを作成する場合には、「button」値を設定して処理を実装していきます。 2.HTMLのボタンでリンク作成してみよう! 2-1.aタグ まず初めに、aタグでリンク用のボタンを作成する方法について紹介していきます。 aタグでのリンク用ボタン作成 aタグでリンク用ボタンを作成する際の基本的な記述の仕方は以下のようになります。 aタグでは、上記の様に「href」属性に遷移先のURLを指定することでリンク用の実装が可能となります。 しかし、このままではテキスト形式の表示となるため、CSSでボタンに見える様デザインしていく必要があります。 サンプルコード シンプルにボタンをクリックした際に、「index.html」と同一階層に配置した「sample.html」ファイルの内容を表示するサンプルコードを紹介します。 index.html <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Button Link Sample</title> <link rel="stylesheet" href="style.css"> </head> <body> <a href="sample.html" class="btn">サンプル</a> </body> </html> style.css .btn { border-radius: 5px; background-color: lightblue; padding: 10px; text-decoration: none; color: white; } sample.html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>HELLO!!!!!!</h1> </body> </html> サンプルコードを実行した結果が下記の通りです。 また「href」属性に飛びたい外部の遷移先のURLを埋め込むことで、該当ページに遷移することもできます。 以下はインスタグラムに飛ぶサンプルコードです。 index.html <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Button Link Sample</title> <link rel="" href="style.css"> </head> <body> <a href=""https://www.instagram.com/geek_comm2" class="btn">サンプル</a> </body> </html> 上記のサンプルコードを実行した結果が下記の通りです。 インスタのボタンの作り方 こちらのインスタグラムのロゴを表紙させる方法を紹介します。 デザイン1:アプリアイコン風 一つ目は、iPhoneアプリのアイコン風のボタンです。アイコンは、FontAwesomeにより表示しています。 サンプルコード <a href="#" class="insta_btn"> <span class="insta"> <i class="fab fa-instagram"></i> </span> Follow Me </a> .insta_btn { display: inline-block; text-align: center;/*中央揃え*/ color: #2e6ca5;/*文字色*/ font-size: 20px;/*文字サイズ*/ text-decoration: none;/*下線消す*/ } .insta_btn:hover {/*ホバー時*/ color:#668ad8;/*文字色*/ transition: .5s;/*ゆっくり変化*/ } .insta_btn .insta{/*アイコンの背景*/ position: relative;/*相対配置*/ display: inline-block; width: 50px;/*幅*/ height: 50px;/*高さ*/ background: -webkit-linear-gradient(135deg, #427eff 0%, #f13f79 70%) no-repeat; background: linear-gradient(135deg, #427eff 0%, #f13f79 70%) no-repeat;/*グラデーション①*/ overflow: hidden;/*はみ出た部分を隠す*/ border-radius: 13px;/*角丸に*/ } .insta_btn .insta:before{/*グラデーションを重ねるため*/ content: ''; position: absolute;/*絶対配置*/ top: 23px;/*ずらす*/ left: -18px;/*ずらす*/ width: 60px;/*グラデーションカバーの幅*/ height: 60px;/*グラデーションカバーの高さ*/ background: -webkit-radial-gradient(#ffdb2c 10%, rgba(255, 105, 34, 0.65) 55%, rgba(255, 88, 96, 0) 70%); background: radial-gradient(#ffdb2c 10%, rgba(255, 105, 34, 0.65) 55%, rgba(255, 88, 96, 0) 70%);/*グラデーション②*/ } .insta_btn .fa-instagram {/*アイコン*/ color: #FFF;/*白に*/ position: relative;/*z-indexを使うため*/ z-index: 2;/*グラデーションより前に*/ font-size: 35px;/*アイコンサイズ*/ line-height: 50px;/*高さと合わせる*/ } デザイン2:アイコンに影をつけてみる box-shadowをcssに追加することによりアイコンに影をつけ、カーソルを当てると浮かび上がるようにしてみます。 サンプルコード 先程のコードに以下を加えてください。 .insta_btn .insta{ box-shadow: 0px 1px 2px rgba(25, 25, 25, 0.50); transition: .4s; } .insta_btn .insta:hover{ box-shadow: 0px 2px 3px rgba(25, 25, 25, 0.50); } デザイン3:文字にもグラデーションをのせる アイコンだけでなく文字もグラデーションの上にのせて、横長のボタンにしてみました サンプルコード <a href="#" class="insta_btn2"> <i class="fab fa-instagram"></i> <span>Follow Me</span> </a> .insta_btn2{/*ボタンの下地*/ color: #FFF;/*文字・アイコン色*/ border-radius: 7px;/*角丸に*/ position: relative; display: inline-block; height: 50px;/*高さ*/ width: 190px;/*幅*/ text-align: center;/*中身を中央寄せ*/ font-size: 25px;/*文字のサイズ*/ line-height: 50px;/*高さと合わせる*/ background: -webkit-linear-gradient(135deg, #427eff 0%, #f13f79 70%) no-repeat; background: linear-gradient(135deg, #427eff 0%, #f13f79 70%) no-repeat;/*グラデーション①*/ overflow: hidden;/*はみ出た部分を隠す*/ text-decoration:none;/*下線は消す*/ } .insta_btn2:before{/*グラデーション②*/ content: ''; position: absolute; top: 0; left: 0; width: 100%;/*全体を覆う*/ height: 100%;/*全体を覆う*/ background: -webkit-linear-gradient(15deg, #ffdb2c, rgb(249, 118, 76) 25%, rgba(255, 77, 64, 0) 50%) no-repeat; background: linear-gradient(15deg, #ffdb2c, rgb(249, 118, 76) 25%, rgba(255, 77, 64, 0) 50%) no-repeat; } .insta_btn2 .fa-instagram{/*アイコン*/ font-size: 35px;/*アイコンサイズ*/ position: relative; top: 4px;/*アイコン位置の微調整*/ } .insta_btn2 span {/*テキスト*/ display:inline-block; position: relative; transition: .5s } .insta_btn2:hover span{/*ホバーで一周回転*/ -webkit-transform: rotateX(360deg); -ms-transform: rotateX(360deg); transform: rotateX(360deg); } デザイン4:正方形ボタン デザイン3を正方形にしてみたものです。今度はボタンにカーソルを当てると、アイコンがくるんと回転するようにしてみました サンプルコード <a href="#" class="insta_btn3"> <i class="fab fa-instagram"></i><div>Follow Me</div> </a> .insta_btn3 {/*ボタンの下地*/ color: #FFF;/*文字・アイコン色*/ border-radius: 14px;/*角丸に*/ position: relative; display: block; height: 120px;/*高さ*/ width: 120px;/*幅*/ text-align: center;/*中身を中央寄せ*/ padding-top: 12px;/*上側との余白*/ box-sizing: border-box; font-size: 19px;/*文字のサイズ*/ background: -webkit-linear-gradient(135deg, #427eff 0%, #f13f79 70%) no-repeat; background: linear-gradient(135deg, #427eff 0%, #f13f79 70%) no-repeat;/*グラデーション①*/ overflow: hidden;/*はみ出た部分を隠す*/ text-decoration:none;/*下線は消す*/ } .insta_btn3:before{/*グラデーション②*/ content: ''; position: absolute; top: 0; left: 0; width: 100%;/*全体を覆う*/ height: 100%;/*全体を覆う*/ background: -webkit-linear-gradient(15deg, #ffdb2c, rgb(249, 118, 76) 25%, rgba(255, 77, 64, 0) 50%) no-repeat; background: linear-gradient(15deg, #ffdb2c, rgb(249, 118, 76) 25%, rgba(255, 77, 64, 0) 50%) no-repeat; } .insta_btn3 div { position: relative; } .insta_btn3 .fa-instagram { font-size: 70px;/*アイコンサイズ*/ position: relative; display:inline-block; position: relative; transition: .5s } .insta_btn3 .fa-instagram:hover {/*ホバーで一周回転*/ -webkit-transform: rotateX(360deg); -ms-transform: rotateX(360deg); transform: rotateX(360deg); } 2-2.buttonタグ 次に「button」タグについて紹介していきます。 buttonタグの基本 「button」タグでは、先程のaタグとは異なり、CSSでデザインしなくても、デフォルトでボタンとしてWebサイト上に表示することが可能です。 「location.href=’URL’」で飛びたい先のURLを指定してあげることで、ボタンをクリックした際にその指定したURLに画面遷移することできます。 サンプルコード 全体像をサンプルコードで確認していきたいと思います。 遷移先となる「sample.html」はaタグで利用したサンプルコードと同じなため、割愛しています。 index.html <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Button Link Sample</title> </head> <body> <button onclick="location.href='sample.html'">サンプル</button> </body> </html> サンプルコードを実行した結果が下記の通りです。 今回がcssで装飾していないため、buttonタグのデフォルトの状態で表示されていますが、cssで装飾することも可能です。 2-3.inputタグ HTMLのボタンは「input」タグを利用することでも表示することが可能です。 「input」タグでは「type」属性に「button」を指定することでボタンを表示します。 リンクとして実装するには、先程のbuttonタグと同様、「location.href=’URL’」で飛びたい先のURLを指定してあげることでできます。 input属性では閉じタグを指定しないため、ボタンに表示したいテキストは「value」属性に設定してください。 サンプルコード inputタグでボタンを作成するサンプルコードの全体像を確認してみましょう。 index.html <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Button Link Sample</title> </head> <body> <input type="button" onclick="location.href='sample.html'" value="サンプル"> </body> </html> sample.html <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h1>HELLO!!!!!!</h1> <input type="button" onclick="history.back()" value="戻る"> </body> </html> サンプルコードを実行した結果が下記の通りです。 まとめ 今回は内容が盛り沢山だったと思います。 何度か読み返して復習しましょう! みなさんお疲れ様でした!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初歩中の初歩】Rubyで掛け算をしてみよう★

今回はRubyを使って掛け算をしてみます。 問題:2つの正の整数a, bが改行区切りで入力されるのでaとbを掛け算した数値を出力してください。 解答 解答コード a = gets.to_i b = gets.to_i puts a*b 解説 解説 a = gets.to_i to._iでaの保存形式をinteger型にしています。 これによって、puts a*bで数値の計算が行われることになります。 解説 解説 puts a*b putsメソッドによって実際に出力を行います。 Rubyでは「*」が「×(かける)」の意味を持ちます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【コピペ】Railsで診断機能を実装する方法

今回はRuby on Railsで診断機能を実装します。 目次は以下の通りです。 1.コントローラー設計 2.データベース周り 3.Viewページ周り 4.ルート周り 1.コントローラー設計 perfumes_controller.rb class PerfumesController < ApplicationController def index end def new @perfume = Perfume.new end def show @perfume = Perfume.find_by(id: params[:id]) end def create @perfume = Perfume.new(perfume_params) params[:perfume][:question] ? @perfume.question = params[:perfume][:question].join("") : false if @perfume.save flash[:notice] = "診断が完了しました" redirect_to perfume_path(@perfume.id) else redirect_to :action => "new" end end private def perfume_params params.require(:perfume).permit(:id, question: []) end end 2.データベース周り ターミナル/コマンドプロンプト $ rails g model Perfume question:string ターミナル/コマンドプロンプト $ rails db:migrate 3.Viewページ周り perfumes/index.html.erb <!DOCTYPE html> <!-- この文章がHTML文章であることを伝える要素です。--> <html lang="ja"><!--言語の指定--> <head><!--ページに表示されない情報(サイトの裏側の設定)--> <meta charset="utf-8"> <title>香水診断スタート</title><!--ブラウザのタブのタイトルを指定--> </head> <body> <header> <h1 class="headline"> <a>Perfu_me</a> </h1> <ul class="nav-list"> <li class="nav-list-item">about fragrance</li> <li class="nav-list-item"><%= link_to "診断", perfumes_path, class: "link" %></li> </ul> </header> <div class="start"> <h6>Are you ready?</h6> <%= link_to "診断を始める", new_perfume_path, class: "link" %> </div> </body> perfumes/new.html.erb <%= form_for(@perfume, class: 'form-horizontal', role: 'form') do |f| %> <div class="container-sindan"> <div class="row"> <div class="col-12"> <p>Question1. どちらかと言うと…</p> </div> <div class="col-6"> <p><%= f.check_box :question, {multiple: true}, "1", nil %>じっくり考える方だ</p> </div> <div class="col-6"> <p><%= f.check_box :question, {multiple: true}, "2", nil %>考えるより行動する方だ</p> </div> <div class="col-12"> <p>Question2. 自分の価値観として近い方は…</p> </div> <div class="col-6"> <p><%= f.check_box :question, {multiple: true}, "1", nil %>周りの人と違う存在でありたい</p> </div> <div class="col-6"> <p><%= f.check_box :question, {multiple: true}, "2", nil %>周りと同じでいたい</p> </div> <div class="col-12"> <p>Question3. 人と接するときは…</p> </div> <div class="col-6"> <p><%= f.check_box :question, {multiple: true}, "1", nil %>相手の話をよく聞く方だ</p> </div> <div class="col-6"> <p><%= f.check_box :question, {multiple: true}, "2", nil %>自分の話をよくする方だ</p> </div> <div class="col-12"> <p>Question4. 大切にしたいのは…</p> </div> <div class="col-6"> <p><%= f.check_box :question, {multiple: true}, "1", nil %>論理性だ</p> </div> <div class="col-6"> <p><%= f.check_box :question, {multiple: true}, "2", nil %>情緒だ</p> </div> </div> </div> <div class="sindanbotan"> <%= f.submit "post" %> </div> <% end %> perfumes/show.html.erb <div class="intoro"> <h5>診断結果</h5> <p>あなたにおすすめの香りは…</p> </div> <div class="tweet-container"> <div class="tweet"> <% if @perfume.question == "1111" %> <h6>レモン</h6> <p>柑橘系の代表的な原料</p> <p>清涼感があり、爽やかな印象</p> <% elsif @perfume.question == "1112" %> <h6>シトラス</h6> <p>オレンジに似た柑橘系の果物</p> <p>リラックス効果がある</p> <% elsif @perfume.question == "1121" %> <h6>ローズ</h6> <p>華やかで上品な香り</p> <p>ストレスを緩和してくれる効果がある</p> <% elsif @perfume.question == "1122" %> <h6>ラベンダー</h6> <p>優しく女性らしい香り</p> <p>気持ちを落ち着かせてくれる</p> <% elsif @perfume.question == "1211" %> <h6>ジャスミン</h6> <p>爽やかなのに官能的な香り</p> <p>幸福感を得やすい</p> <% elsif @perfume.question == "1212" %> <h6>ピーチ</h6> <p>フレッシュで優しい香り</p> <p>アンチエイジングにも最適</p> <% elsif @perfume.question == "1221" %> <h6>アップル</h6> <p>特徴的で甘い香り</p> <p>万人受けしやすい</p> <% elsif @perfume.question == "1222" %> <h6>ユーカリ</h6> <p>しっかりとした優しい香り</p> <p>浄化作用があり。気持ちを落ち着かせてくれる</p> <% elsif @perfume.question == "2111" %> <h6>ローズマリー</h6> <p>きりりとした強めの香りが特徴的</p> <p>美容効果が高い</p> <% elsif @perfume.question == "2112" %> <h6>ベルガモット</h6> <p>柑橘系の果実</p> <p>甘くてフレッシュな、万能な香料</p> <% elsif @perfume.question == "2121" %> <h6>ムスク</h6> <p>雄のジャコウジカの腹部にある香嚢から抽出した香料</p> <p>官能的で重い香り</p> <% elsif @perfume.question == "2122" %> <h6>アンバー</h6> <p>マッコウクジラの結石から抽出した香料</p> <p>魅惑的で色気のある香り</p> <% elsif @perfume.question == "2211" %> <h6>シナモン</h6> <p>甘いスパイスの香り</p> <p>香水のアクセントとしてよく使われる</p> <% elsif @perfume.question == "2212" %> <h6>バニラ</h6> <p>甘くて官能的な香り</p> <p>上品で年齢を問わず人気が高い</p> <% elsif @perfume.question == "2221" %> <h6>イランイラン</h6> <p>色気のある濃厚で甘い香り</p> <p>恋愛に効果があり</p> <% elsif @perfume.question == "2222" %> <h6>サンダルウッド</h6> <p>お香としてよく使われる白檀の香り</p> <p>集中力を高める効果もあり</p> <% end %> </div> 4.ルート周り routes.rb #省略 resources :perfumes #省略 以上です!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby] AtCoder過去問 C - Alchemist

はじめに AtCoder過去問C問題をRubyで解いてみました。 問題はこちらから確認してください。↓ C - Alchemist なんだかゲームとかで使われそうなアルゴリズムですね。 入力受け取りから書いていきます。 n = gets.to_i worth = gets.split.map(&:to_i).sort! ちなみに私の解き方では1行目のnは使いません。 2行目は複数の値をworth(価値)という変数に配列として代入しています。 また.sort!をつけてます。これは配列の中身を昇順に並び替えています。 この問題の肝は、どの順番に合成していけば最大価値を持ったの具材が作れるかです。 その条件は小さいものから、処理を行うことです。 配列を昇順に並び替えたのはそのためです。 shiftメソッドがかなりいきてきます。 ちなみにshiftの使い方はこちらにまとめております。↓ n = gets.to_i worth = gets.split.map(&:to_i).sort! ans = worth.shift while worth != [] ans = (ans + worth.shift)/2.to_f end puts ans 問題文の足して2で割るという処理は合成された時のみなので一番初めの元となる具材には適用しません。 ですのではじめにansに一番小さい要素(配列の先頭)を代入しておきます。 while文の条件式に配列worthが空になるまで処理を繰り返すようにします。 処理の中身はworthの中で一番小さい要素(配列の先頭)を取り出して、ansに足して、2で割ってansに代入です。 worthの中が空になったらansに一番価値が大きい方法で合成された具材の価値が入っているはずです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails s で An error occurred while installing pg (1.2.3), and Bundler cannot continue.が出た

概要 macを買い替え、以前のPCで技術書を参考に自作したアプリケーションを立ち上げようとrails s をしたら、表題のエラーが出た。 開発環境 MacBook Pro (13-inch, M1, 2020) macOS Big Sur バージョン 11.5.2 rails sでエラーが出た terminal $ rails s ~ An error occurred while installing pg (1.2.3), and Bundler cannot continue. Make sure that `gem install pg -v '1.2.3' --source 'https://rubygems.org/'` succeeds before bundling. 素直にやってみる。 terminal $ gem install pg -v '1.2.3' terminal $ rails s Ignoring bootsnap-1.7.3 because its extensions are not built. Try: gem pristine bootsnap --version 1.7.3 Ignoring bootsnap-1.7.1 because its extensions are not built. Try: gem pristine bootsnap --version 1.7.1 Ignoring bootsnap-1.5.1 because its extensions are not built. Try: gem pristine bootsnap --version 1.5.1 Ignoring eventmachine-1.0.9.1 because its extensions are not built. Try: gem pristine eventmachine --version 1.0.9.1 Ignoring ffi-1.14.1 because its extensions are not built. Try: gem pristine ffi --version 1.14.1 Ignoring ffi-1.13.1 because its extensions are not built. Try: gem pristine ffi --version 1.13.1 Ignoring ffi-1.12.2 because its extensions are not built. Try: gem pristine ffi --version 1.12.2 Ignoring msgpack-1.3.3 because its extensions are not built. Try: gem pristine msgpack --version 1.3.3 Ignoring nio4r-2.5.5 because its extensions are not built. Try: gem pristine nio4r --version 2.5.5 Ignoring nio4r-2.5.4 because its extensions are not built. Try: gem pristine nio4r --version 2.5.4 Ignoring sqlite3-1.4.0 because its extensions are not built. Try: gem pristine sqlite3 --version 1.4.0 Ignoring thin-1.8.0 because its extensions are not built. Try: gem pristine thin --version 1.8.0 Ignoring thin-1.5.1 because its extensions are not built. Try: gem pristine thin --version 1.5.1 => Booting Puma => Rails 5.2.4.5 application starting in development => Run `rails server -h` for more startup options Puma starting in single mode... * Version 3.12.6 (ruby 2.6.6-p146), codename: Llamas in Pajamas * Min threads: 5, max threads: 5 * Environment: development * Listening on tcp://localhost:3000 Use Ctrl-C to stop 一応サーバーは立ち上がったが、Ignoringが気になるので消したい。 $ gem install bundler $ bundle install で消えました。 参考 https://tsubasa0105.hatenablog.com/entry/2018/11/29/180051 https://qiita.com/ROY_M/items/43fd1370e3d89ae50074 https://teratail.com/questions/139925
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

letとlet!とbeforeの使い分け

こんにちは、プレイライフの熊崎です。 最近野菜をとれていなかったので、この土日はいっぱい野菜を食べたいと思います。 本日3本目はletとbeforeの使い分けについてアウトプットしていきます。 let メモ化されたヘルパーメソッドを定義する。同じexampleの中ではキャッシュされるが、異なるexample間ではキャッシュされない。 遅延評価される。letが定義するメソッドが最初に呼び出されるまで評価されない。 sample_spec.rb let(:user) { User.create(name: "田中太郎") } # letは遅延評価されるため、userが呼び出されるまで、Userにはレコードが作られていない状態になる。そのためテストが通らない。 it 'ユーザーが取得できること' do expect(User.find_by(name: "田中太郎")).to eq user end let! 各exampleの実行前に、定義されたメソッドを呼び出すことができる。 sample_spec.rb let!(:user) { User.create(name: "田中太郎") } # let!にすることで、以下のテストケースの前に、userメソッドが呼ばれるため、Userにレコードが存在する状態になる。そのため、テストには通る。 it 'ユーザーが取得できること' do expect(User.find_by(name: "田中太郎")).to eq user end before テストケースの前に、行いたい処理をブロック内に書くことで、テストケースが実行される前にブロック内の処理が行われるようにする。 sample_spec.rb before do User.create(name: "田中太郎") end # この場合はuserがテストコードにないので、let(:user)を使用する必要がない。 it 'ユーザーが取得できること' do expect(User.count).to eq 1 end それぞれの使い分け 先ほどまでの実例から、以下のように使い分けるのが適切だと感じた。 let:テストコード内に、定義したヘルパーメソッドが存在する場合 let!:テストコード内に、定義したヘルパーメソッドが存在し、かつテストの実行前にヘルパーメソッドを実行したい場合 before:テストコード内でヘルパーメソッドを定義する必要がない場合 最後に それぞれの挙動を理解していないと、テストコードに存在しないヘルパーメソッドをletで用意している。といった状況になり、レビュワーや数ヶ月後の自分が混乱するので使い分けを徹底していく必要があると感じた。 参考記事
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

delegateについて

こんにちは、プレイライフの熊崎です! 昨日の夜食べたラーメンのせいで、若干胃もたれ気味です。 学生の頃はラーメン+ライスでも全然平気だったのに、、、 時の流れを感じますね笑 そんな僕の話は置いておいて、delegateについての記事を書いていきたいと思います。 deledateとは delegateマクロを使って、メソッドを簡単に委譲できます。 https://railsguides.jp/active_support_core_extensions.html?version=6.0#delegate → あるクラスに存在するメソッドを他のクラスで使用できるようにする どんな時に使用するか? 関連付けられているモデルのメソッドを直接使用したいとき。 基本の使い方 sample.rb class SampleUser < ApplicationRecord has_one :sample_plan     # delegateには複数のメソッドを指定できる。 delegate :free_plan?, to: :sample_plan end # SamplePlanモデルはname属性を持っていると仮定 # 有料プランはnameが”有料プラン” # 無料プランはnameが”無料プラン” class SamplePlan < ApplicationRecord belongs_to :sample_user def free_plan? name == "無料プラン" end end # ユーザーが無料プランかどうかを確認したい時 # delegateを使わないとこんな感じ。冗長だしパッと見で意味がわかりづらい。 sample_user.sample_plan.free_plan? # delegateを使用することで、SamplePlanモデルのメソッドを直接実行できる。簡潔だし、意味も明快 sample_user.free_plan? オプション :allow_nil 上記の例で、あるsample_userに、sample_planが紐づいていない場合sample_user.free_plan?を呼び出すとNoMethodErrorを返す。 allow_nil: trueにすることで、nilを返すようにできる。 :prefix メソッド名を変更したいときに使用する。 sample.rb class SampleUser < ApplicationRecord has_one :sample_plan delegate :free?, to: :sample_plan, prefix: :plan end # SamplePlanモデルはname属性を持っていると仮定 # 有料プランはnameが”有料プラン” # 無料プランはnameが”無料プラン” class SamplePlan < ApplicationRecord belongs_to :sample_user def free? name == "無料プラン" end end # ユーザーが無料プランかどうかを確認したい時 sample_user.sample_plan.free? # prefix: :planとしたことで、free?メソッドの名前がplan_free?に変更された。 sample_user.plan_free? まとめ delegateを使用することで、関連するモデルのメソッドを直接参照できる。 delegateを使用することで、より可読性の高いコードを書くことができる。 参考URL https://railsguides.jp/active_support_core_extensions.html?version=6.0#delegate https://api.rubyonrails.org/classes/Module.html#method-i-delegate
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】 環境構築

手順 ① 作業ディレクトリの作成 $ mkdir workspace/my/rails_sample $ my/rails_sample ② rubyのバージョン切り替え $ rbenv install 2.7.2 $ rbenv local 2.7.2 $ ruby -v # 指定バーションが表示されて売ればOK rbenv 〜 rubyのバージョンを切り替えるためのツール ③ bundleとrails $ gem install bundler # rubyのライブラリを管理するbundlerをrubyにインストール $ bundle init # 生成されたGemfileをgem "rails"に編集 $ bundle install bundle init 〜 現在の作業ディレクトリ内に、Gemfileを生成 ④ プロジェクトの作成 rails _6.0.3.7_ new sample その他 nodeやyarnのインストール データベースの作成 フロントエンドの構築 ext...
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Railsを使用する恩恵

おはようございます、プレイライフの熊崎です。 今週は雨の日が多かったですね。 来週も雨の日が多いようで、気が滅入ってしまいます。。。 来週も、雨にも負けず風にも負けず仕事を頑張っていきたいと思います! なぜこの記事を書こうと思ったか? 業務を行っていて、railsの機能を充分には使いこなせていなかった。(今振り返ると、そもそも使いこなそうともしていなかったように感じる。) 原因を考えてみたら、下記の原因が考えられた。 なんでrailsの規約に沿った書き方をしなければいけないのか?という理由が自分の中で明確になっていなかった。 スピード感を持って開発することが求められている中で、とりあえず動くものを作るということに意識を向け過ぎた。 スピード感を持って開発することが求められている中で、とりあえず動くものを作るということに意識を向け過ぎた。に関しては、今までの経験上、後で修正しようと考えても絶対修正まで手が回らないので、都度railsの機能を利用することを徹底することにした。 ↑ のように考えても、railsを使用する恩恵の理解が薄いと絶対に上記の意識も薄れてくるので、アウトプットを行うことで自身の理解を深めようと思ったため。 本記事の対象者 ということで、本記事は以下のような方々を対象とする。 自分と同じように何となくでrailsを使用していた方 railsの基本理念 Convention over Configuration(設定より規約) アプリケーションの実装を行う上で、決めなくてはいけないことは沢山ある。(ex:主キーの名前をどうするか、など) そのような決めなくてはいけないこと(設定)を規約に移すことで、設定を決定する時間を軽減することをモットーとする。 railsを使用するメリット 上記の基本理念に則って作られているため、規約に則った書き方をすれば、作業時間を短縮できる。 初心者でも、規約に則った書き方をすれば、最低限のコードの質は担保される。(もちろん、命名規則や単一責任の原則など、コードの質を担保するためには他にも考慮しなければならないことが沢山ある。) 単純にコード量が少なくて済む。 可読性が上がる。 メリットの補足(コード量が少なくて済む・可読性が上がる について) 例: 性別が男性のUserを探したい場合 sample.rb # すでにSampleUsersテーブルに男性や女性の情報が登録されていると仮定する。 # railsのActiveRecordを利用した場合 SampleUser.where(sex: :man) # ↑をrubyで似たようなことを行う場合 SampleUser.select { |user| user.sex == "man" } 前者の方が記述量が少ない。(検索条件が複雑になればさらに記述量に差が出てくる。) また、whereは検索用のメソッドなので、whereと書いてあれば、「何か条件を設定していて、その条件に当てはまるレコードを検索している」ということが直感的に理解しやすい。 一方で、後者だと記述量が多い上に、パッと見で何をやっているか少しわかりづらい。(このコードは短いので、わからなくはないが、検索条件が膨らんでくるとさらに読みづらくなることが予想される。) まとめ railsの理念はConvention over Configurationである。 railsを使いこなすことで、rubyで実装するより、記述量が少なく、かつわかりやすいコードを書ける。 最後に そもそもフレームワークは楽をするために、先人達が知恵を絞って作ったものだから、フレームワークを積極的に使用して作業効率を上げるのは当たり前のことだと思う。 しかし、とにかく動くものを作るという目先のことに囚われすぎて、フレームワークを積極的に使用することに意識が向いていなかった。 とにかく動くものを作る → フレームワークを使わない → フレームワークの使い方を覚えない → 作業スピードが上がらない といった負のスパイラルに陥るため、今後は使ったことのないrailsの機能でも積極的に使っていきたいと思う。 参考文献 https://rubyonrails.org/doctrine
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【mariaDB】データベースの中身の確認について

環境 Ruby on rails 6.1.4 ruby 2.6.5 capistrano mariaDB 5.5.68 経緯 AWSのEC2を使った環境構築をしています。 capistranoを使い自動デプロイを完了しています。 ローカル環境ではSequel Proを使っていたので、ローカルで保存した情報はすぐ確認することができました。 しかし、本番環境のデータベースの中身を確認する方法がわからず。 素人丸出しの「mariaDB 中身 確認」だとかで検索しましたが出てくるのは「select * from モデル名で中身見れますよ〜」ばかりでした。(初心者すぎて調べ方が分かっていない) そもそもDBにたどり着く方法がわからず悩んでいたのですが、なんとか辿り着けたので備忘録を兼ねて記事に残そうと思います。 コード ターミナル内 まずEC2へログインします #ホームディレクトリに移動 xxxx@yyyynoAir ~ % cd #sshディレクトリに移動 xxxx@yyyynoAir ~ % cd .ssh/ #EC2へログイン(ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスに紐付けたElastic IP) xxxx@yyyynoAir .ssh % ssh -i 0000xxxx.pem ec2-user@12.345.67.890 #ログインできればEC2のロゴ?が出現します __| __|_ ) _| ( / Amazon Linux 2 AMI ___|\___|___| ログイン後 #currentディレクトリに移動 [ec2-user@ip-123-45-67-8 ~]$cd /var/www/アプリケーション名/current #mysqlへアクセスするコマンドを入力 [ec2-user@ip-123-45-67-8 current]mysql -u root -p アプリケーション名_production #パスワードを求められるので入力(見た目上は何も表示されませんが入力されているので完了後enterを押す) Enter password: #DBの中に入っているので、select文を使って検索する MariaDB [アプリケーション名_production]> select * from stores \G; 流れとしては上記の通りです。 mysqlのパスワードがわからない方はEC2内のホームディレクトリ[ec2-user@ip-123-45-67-8 ~]へ戻ってもらい「env」と入力すればパスワードが確認できるはずです。 また、select文の\Gはターミナル上で表示されるデータが見やすくなる(抽象的ですいません)ので使っています。 以上です。 ローカルでのデータはすぐ目視で確認できていたので、いざ本番環境のデータを見るとなったときに「どこ見に行けばいいの?」と思ったので作成しました。 内容に不備がございましたらご指摘いただけますと幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】複数モデルの作成日付一覧を重複なく表示する

ポートフォリオ作成中の学びのアウトプットとして投稿させて頂きます。 勉強用アプリを作成中に実装した保存された回答(複数モデル存在)を日付順に重複なく表示する方法です。 実現したいこと users_controllerのshowアクションで回答の作成日付一覧をviewに表示してそれぞれの日付をクリックするとその日に作成された回答一覧を確認できるようにしたい。 ※下図のイメージ モデル 回答用モデルとして「answer」と「reaction」が存在。 showアクションとviewの中身 users_controller.rb def show @answers_dates = current_user.answers.map{|dates| dates.created_at.to_date} @reactions_dates = current_user.reactions.map{|dates| dates.created_at.to_date} @dates = @answers_dates.push(@reactions_dates).flatten.uniq.sort.reverse end show.html.erb <% @dates.each do |record| %> <li> <%= link_to record, answers_path(created_at: record) %>    </li> <% end %> 中身の説明 @answers_dates = current_user.answers.map{|dates| dates.created_at.to_date} @reactions_dates = current_user.reactions.map{|dates| dates.created_at.to_date} 全てのanswer及びreactionをインスタンス変数に配列として保存する。同時に年月日だけ表示されれば良いのでto_dateメソッドを用いて変換。 @dates = @answers_dates.push(@reactions_dates).flatten.uniq.sort.reverse 二つの配列をpushメソッドで結合。結合すると配列が入れ子構造になるので(ex,[2021-09-08, [2021-09-08,2021-09-09]])、flattenメソッドで入れ子構造を外す。uniqメソッドで重複を除去、さらにsort.reverseで日付が近い順に並び替える。 ※入れ子構造を外さないとuniqで上記の例だと2021-09-08の重複を除去できない。 <% @dates.each do |record| %> <li> <%= link_to record, answers_path(created_at: record) %>    </li> <% end %> 後は表示される日付にリンクを付属し、その日付をparamsとしてパスに与えることでその日付に作成されたモデルを取り出せる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む