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

アプリ制作で参考にしたリンク集(バックエンド編)(随時更新)

Devise(gem) git fatal: object {hash} is corrupt
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[反省]RailsAdminでundefind method ‘properties’ for nil:NilClassが発生した件について

始めに 反省含めて、記述します。 より詳しいことがわかる方いたら、コメントしてくださると嬉しいです。 エラー内容 今回、RailsAdminを導入しました。導入後、画面の表示までは成功したのですが、一部のモデルにアクセスしようとするとエラーが発生しました。 試したこと 正直、何も心あたりがなかったので、まずは仮説すら立てられず、、、、が、とりあえずアクセスできないモデルとアクセス可能なモデルの比較を行いました。また、ネット等でひたすら調べました。 わかったこと ひとまず比較してみると、ActiveHashとアソシエーションを結んでいるものにエラーが出ていると言うところまで突き止めました。そこで、ActiveHashを使わずenumを使用するとうまくいくことはわかりました。 わからないこと 依然として、なぜActiveHashが使えないのか不明のままです。また、使ってもうまくいくような対処法もわからないままです。 今回のエラー対応で学んだこと エラーに対して、すぐ人に聞く、あるいは誰かに丸投げというのはあまり好きではない私ですが、さすがに6時間以上粘ってもダメなものはダメなんだなと感じました(実は今回、課金してプロエンジニアさんに相談しました)。時には、諦めて人に聞いたり、もしかしすると諦めることも”進める”ためには大切な選択肢なのかもしれません。 これから、転職してプロのエンジニアとして働いていくことを目指しておりますが、現場ではもっとスピードと正確性が求められるはずなので、今自分にできることとできないことの切り分けをしっかり行い、次に何ができるかを考えることが重要なんだと、感じました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails初学者によるRailsチュートリアル学習記録⑤ 第3章

目次 1. はじめに 2. 第3章の概要 3. 学習内容 4. 終わりに 1. はじめに この記事は、Rails初学者の工業大学三年生がRailsチュートリアルの学習記録をつけるための記事です。 筆者自体がRailsやWebについて知識が少ないので、内容の解釈などに間違いがある可能性があります。(その時はコメントで指摘してくださると助かります!) Railsチュートリアル内ではRailsの内容以外にも、gitでのバージョン管理やHerokuを使ったデプロイも学習しますが、gitに関しては既に私が学習済みのため学習記録には記述しません。 演習の記録も省略します。 2. 第3章の概要 第3章からは本格的なサンプルアプリケーションを1から開発していきます。 まずは静的なページを自分で作成して少しずつ動的なコンテンツを追加という流れです。 この章ではほんの少しの動的なコンテンツを追加して、プログラミングに必要な自動化テストを学んでいきます。 ほぼ静的なページの作成 コントローラの生成 テスト駆動開発 テストコードの書き方 コードのリファクタリング リファクタリングとは HTMLファイルの内容のテスト HTMLにRubyを埋め込む 3. 学習内容 1. ほぼ静的なページの作成 1-1. コントローラの生成 ①コントローラを生成するコマンド 静的なページの作成に必要なコントローラは、scaffoldでも使用したrails generateコマンドを使用します。 今回はコントローラ名を「StaticPages」に設定して、Homeページ、Helpページ、Aboutページ、という3つのページを作成します。 つまりそれに対応するアクションをStaticPagesコントローラを作成するということです。 そのためのコマンドはrails generate controller StaticPages home helpです。 このコマンドではaboutアクションは作成されませんが、aboutアクションはコマンドを使わず1から作成していきます。 ②生成されるページ コントローラを作成した段階でルーティングが設定されるので、そのURLにアクセスすればページが表示されます。 今回は以下のようなルーティングと、アクション、ビューが設定されています。 config/routes.rb Rails.application.routes.draw do get 'static_pages/home' #homeアクションのURL get 'static_pages/help' #helpアクションのURL root 'application#hello' end app/controllers/static_pages_controller.rb class StaticPagesController < ApplicationController def home #homeアクション end def help #helpアクション end end 出典 https://railstutorial.jp/chapters/static_pages?version=5.1 1-2. テスト駆動開発 サンプルアプリでは変更を行う際に、自動化テストも同時に作成して機能が正しく実装されているかを確認するようにします。 テストコードを書くタイミングには変更の内容や、テストを作成する開発者の技量によって変わりますが、 大きく分けて以下の2つのタイミングでテストコードを書きます。 「テストコードを先に書いてからアプリの変更を行う」 「アプリの変更を行ってからテストコードを書く」 この2つのタイミングの内、テストコードを先に書く方法をテスト駆動開発と呼びます。 テスト駆動開発は開発に慣れてくると扱えるようになるのですが、Railsチュートリアルでも必要に応じてテスト駆動開発を採用しています。 1-3. テストコードの書き方 ①デフォルトのテストコード テストコードはコントローラ作成用のコマンドを実行時に、テストファイルが作成されるのでそこにテスト内容を記述していきます。 以下のコードはStaticPaagesコントローラのデフォルトのテストです。 test/app/controllers/static_pages_controller_test.rb require 'test_helper' class StaticPagesControllerTest < ActionDispatch::IntegrationTest test "should get home" do get static_pages_home_url assert_response :success end test "should get help" do get static_pages_help_url assert_response :success end end この2つのテストは、それぞれhomeページとhelpページがリクエストに対して正常にレスポンスを返すかをテストするコードです。 get static_pages_home_urlで指定したURLにgetリクエストを送っていて、 assert_response :successでレスポンスが成功になっているかを確かめています。 ②テスト駆動開発をやってみる ここからは、aboutアクションをテスト駆動開発で作成していきます。 まずは、homeアクションとhelpアクションと同じ内容のテストを作成します。 test/app/controllers/static_pages_controller_test.rb require 'test_helper' class StaticPagesControllerTest < ActionDispatch::IntegrationTest test "should get about" do get static_pages_about_url assert_response :success end end テストコードを追記してテストを実行すると $ rails test NameError: undefined local variable or method static_pages_about_url' 上記のようにエラーが返ってきます。 これはaboutページへのURLが見つからないというエラーなので、ルーティングファイルにURLを追加すると解消されます。 追記した後、またテストを実行すると以下のエラーが返ってきます。 $ rails test AbstractController::ActionNotFound: The action 'about' could not be found for StaticPagesController' このエラーはaboutアクションがコントローラーにないというエラーです。 これはコントローラにaboutアクションを追記すれば解消されます。 またテストを実行すると、 $ rails test ActionController::UnknownFormat: StaticPagesController#about is missing a template for this request format and variant. このようなエラーが返ってきます。 このエラーはビューファイルがないため発生しています。 よって、about.html.erbというビューファイルを作成して内容を記述するとこのエラーは解消されます。 もう一度テストを実行するとテストは成功となります。 $ rails test 3 tests, 3 assertions, 0 failures, 0 errors, 0 skips 2. コードのリファクタリング 2-1. リファクタリングとは リファクタリングとはプログラムの動作を変えずに、 コードの構造を変更して動作速度を速めたり、可読性を高めたりといった改善を行うことです。 2-2. HTMLファイル内容のテスト ①リファクタリングの内容 今回のリファクタリングはビューファイルのタイトルタグの内容をページごとに自動で変更されるようにします。 この変更もテスト駆動開発で行っていくため、まずテストを作成していきます。 ②タイトルをテストする このテストではtitleタグに指定した文字列が入っているかをテストします。 以下のコードがhomeビューのtitleタグの内容が、 「"Home | Ruby on Rails Tutorial Sample App」となっているかを確かめるテストです。 test/app/controllers/static_pages_controller_test.rb require 'test_helper' class StaticPagesControllerTest < ActionDispatch::IntegrationTest test "should get home" do get static_pages_home_url assert_response :success assert_select "title", "Home | Ruby on Rails Tutorial Sample App" #タイトルタグのテスト end 上記のコードのassert_select "title", "Home | Ruby on Rails Tutorial Sample App"の部分で titleタグの内容を確認しています。 第一引数が内容を確認したいタグを指定していて、第二引数が存在しているか確かめたい内容です。 このようなテストを他のページにも同様に書きます。 2-3. HTMLにRubyを埋め込む リファクタリングで実装したいページごとに自動でタイトルが変わるようにする変更は、 HTMLにRubyを埋め込むことで実装していく。 以下のコードが埋め込みRubyによってタイトルが自動的に変更されるようになったビューです。 app/views/layouts/application.html.erb <!DOCTYPE html> <html> <head> <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</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> このファイルはビューファイルのheadタグ等の共通部分を記述して、<%= yield %>の部分で各ページの内容を挿入します。 これによって各ビューファイルの共通部分を一箇所にまとめています。 titleタグの下の4行はRailsが作成してくれるJavascriptを扱えるようにするためのコードや、 クロスサイトスクリプティング攻撃の対策用のコード等です。 titleタグの中の<%= yield(:title) %>で各ページのタイトルを自動的に挿入しています。 これは各ビューファイルで<% provide(:title, "Home") %>のように記述することで第一引数でラベルを定義して、 第二引数で値を入力することで、その値を受け取って挿入してくれるコードです。 この2つのコードによって、各ビューファイルごとに入力されたタイトルが挿入されて、タイトルが自動的に変更されるようになります。 4. 終わりに 第三章から、本格的なWebアプリケーションの開発が始まりました。 内容もこれまでの2つの章と比べると濃くなっており、記事の内容も大分長くなってしまいました。 これでも端折ったほうなのですが、記事の作成が大変です:( テストやリファクタリングといった、Progateなどでは触れてこなかった内容が出てきましたが、 難易度としてはまだ躓くほどではないので、内容が難しくなってくる前に記事の作成に慣れることができればと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

広大の自己紹介

自己紹介 はじめまして、広大です! 就職活動のためにQiitaをはじめました。 プロフィール 年齢:18歳 学歴:中卒 趣味:映画、音楽 目的と目標 キャリア 目的:Web系自社開発のサーバーサイドエンジニアに就職する 目標:6月までに就職活動に入る 学習 目的:ポートフォリオを一つ作成する 目標:ポートフォリオ作成を中心に体系的学習をする。 学習内容 言語:HTML.CSS.SACC.Ruby.Javascript.SQL.TypeScript ライブラリー:RubyonRails.RSpec.Bootstrap jQuery 最後に Qiita記事は技術面中心にアウトプットしていくのでよろしくお願い致します!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RSpec のsystem spec 実行時にselenium でEnter キーの押下をシュミレートする

RSpec のsystem spec 実行時にselenium でEnter キーの押下をシュミレートする 環境 macOS 10.15.6 Ruby 2.5.7 Rails 5.2.3 rspec-rails 4.0.1 capybara 3.32.2 selenium-webdriver 3.142.7 参照 Keyboard :: Documentation for Selenium send_keys(special)-Ruby ruby on rails - How to simulate pressing Enter in Rspec - Stack Overflow 使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」 - Qiita 目標 上記のような検索実行ボタンの無い検索フォームでテキスト入力後にEnter キーを押して検索を実行する動作をシュミレートしたい 解決策 send_keys メソッドを使う。 下記のような検索フォームに検索テキストとしてkeyword を入力後にEnter キー押下した際の検索結果のテストを想定しています。 <form> <input placeholder='Search' id="keyword_search"> </form> it '検索結果のテスト', js: true do #検索フォームにkeyword を入力 fill_in 'Search , with: 'keyword' #テキスト入力後のEnter キー押下 find("#keyword_search").send_keys :return #検索結果の検証 expect(page).to have_content 'keyword' end ポイント selenium 以外のヘッドレスブラウザとの情報が色々と混ざってしまったので整理 :return は:enter でも可 :return は小文字でないとNG js: true でJavaScript を有効にする find("#keyword_search").native.send_keys :return ではNG, .native はseleniumでは不要 学び Poltergeist, capybara-webkit 等の他のヘッドレスブラウザ毎に微妙に記述が異なるので使用する環境できちんと調べる事が重要
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails ActiveHashを導入しよう

基本的に変更されないデータを、データベースに保存せずに取り扱う方法 初心者なので、使い方を忘れないように残しておこうと思います。 間違ってたりしたらすいません。 例えば、都道府県名一覧やカテゴリーなど「基本的に変更されないデータ」があったとします。「基本的に変更されないデータ」は、データベースに保存する必要性がありません。一方、ビューファイルなどにそれらのデータを直接書いてしまうと、可読性に欠けます。 そのようなケースでは、ActiveHashが有用です。 ActiveHash Active_Hashとは、都道府県名などの変更されないデータをモデルファイル内に直接記述することで、データベースへ保存せずにデータを取り扱うことができるGemです。 すなわち、Active_Hashを用いることで、モデルファイルに直接記述した変更されないデータに対して、ActiveRecordのようなメソッドを用いることができます。(例えば、allやcreateメソッドのことを指しています。) ActiveHashを導入しよう Gemfileを編集しましょう gem 'active_hash' 記述したらbundle installを実行しましょう。 bundle install モデルを作成しましょう ActiveHashでは自分でファイルを作成します。 app/modelsディレクトリ配下にファイル名.rbを作成します。 前持ってDB設計していると思うので、ファイル名は紐付けたいテーブルのカラム名になるようにする そのファイルの中に ActiveHash::Baseクラスを継承します。 ActiveHash::Baseは、あるモデル内(クラス内)でActiveHashを用いる際に必要となるクラスです。ActiveHashのGemに定義されています。 また、ActiveHash::Baseを継承することで、ActiveRecordと同じようなメソッドを使用できるようになります。 以下のように記述する class Genre < ActiveHash::Base self.data = [ { id: 1, name: '--' }, { id: 2, name: '経済' }, { id: 3, name: '政治' }, { id: 4, name: '地域' }, { id: 5, name: '国際' }, { id: 6, name: 'IT' }, { id: 7, name: 'エンタメ' }, { id: 8, name: 'スポーツ' }, { id: 9, name: 'グルメ' }, { id: 10, name: 'その他' } ] end ジャンルのデータは、配列にハッシュ形式で格納しています。 マイグレーションファイルは先程言った通り class CreateArticles < ActiveRecord::Migration[6.0] def change create_table :articles do |t| t.string :title , null: false t.text :text , null: false t.integer :genre_id , null: false t.timestamps end end end 上記で言えば t.integer :genre_id ,null:false これが紐付けされるように準備されたカラム名です。 型はintegerになります。 してなければ rails db:migrate アソシエーションを設定しよう ActiveHashを用いてアソシエーションを設定する場合は、ActiveHashで定義されているmoduleをモデルに取り込む必要があります。 投稿する記事は、1つのジャンルに紐付いています。そのため、紐付いてるモデルにはbelongs_toを設定します。 ActiveHashを用いて、belongs_toを設定するには、 extend ActiveHash::Associations::ActiveRecordExtensionsと記述してmoduleを取り込みます。 例 class Article < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :genre end ActiveHashを用いてのbelongs_toが設定できました。 ActiveHashを用いて、has_manyを設定するには、 include ActiveHash::Associationsと記述してmoduleを取り込みます。 例 class Genre < ActiveHash::Base self.data = [ { id: 1, name: '--' }, { id: 2, name: '経済' }, { id: 3, name: '政治' }, { id: 4, name: '地域' }, { id: 5, name: '国際' }, { id: 6, name: 'IT' }, { id: 7, name: 'エンタメ' }, { id: 8, name: 'スポーツ' }, { id: 9, name: 'グルメ' }, { id: 10, name: 'その他' } ] include ActiveHash::Associations has_many :articles end バリデーションを設定しよう numericality」というバリデーション のヘルパーを使用します。 numericalityとは、数値かどうかを検証するバリデーションの一種です。 数値であればデータベースに保存を許可して、それ以外では保存が許可されないようにできます。 今回のアプリケーションでは、--を保存されないようにしたいので、id: 1以外であれば保存できるように設定します。 例 class Article < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :genre #空の投稿を保存できないようにする validates :title, :text, presence: true #ジャンルの選択が「--」の時は保存できないようにする validates :genre_id, numericality: { other_than: 1 } end このバリデーションは、genre_idのid:1以外のときに保存できるという意味です。 記事一覧表示機能を実装しよう ストロングパロメーターにもActiveHashで紐付けたカラム名をいれる 例 class ArticlesController < ApplicationController def index @articles = Article.order("created_at DESC") end def new @article = Article.new end def create @article = Article.new(article_params) if @article.save redirect_to root_path else render :new end end private def article_params params.require(:article).permit(:title,:text,:genre_id) end end collection_select collection_selectとは、データをプルダウン形式で表示することができるメソッドです。 collection_selectは、下記のような順番で記述します。 例 <%= form.collection_select(保存されるカラム名, オブジェクトの配列, カラムに保存される項目, 選択肢に表示されるカラム名, オプション, htmlオプション) %> こんな感じです <%= f.collection_select(:genre_id, Genre.all, :id, :name, {}, {class:"genre-select"}) %> 第五引数で、ビュー側で{include_blank: "--"}というオプションを指定する場合もあります。しかし、今回はgenre.rbで{ id: 1, name: '--' }の記述があるため、指定なしとしています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

プログラミングの知識ゼロからrailsを学ぶ

「プログラミングの知識ゼロからrailsを学ぶ」 Rails初めて2週間。自分的にハマった勉強の仕方をキタる。 前提知識 ・HTMLとCSSまあまあ知ってる。 ・Javascriptも少しだけ。(onClickぐらい) 最初やったこと ・とりまRails Tutorialを買って7章まで読んで爆死。 (ウェブデザインしかしたことないから意味不・お経) 爆死理由 ・Rubyを知らない ・テストって何それ美味しいの病にかかる 解決方法 1.プログラミングの勉強の仕方をめちゃ調べる ようつべのケンタとか良かった。 2.Rubyをかじる。  ・ようつべの「キノコード」とかのやつを見る  ・Qiita、テックアカデミー、なんとか侍で「ルビー初心者」の記事を読む ※50パーぐらいわかったら次へ 3.Railsを勉強  ・適当にネットで「rails初心者」みたいなやつをする おすすめ→ https://openbook4.me/projects/92/  ・レールズチュートは訳分からんから今はせん  ・テストもやらん  ・大丈夫少しずつ理解してるから、勉強とティックトックを行き来したら3日ぐらいで分かるようになる 4. 適当に演習をやる  ・rails課題、演習、練習、アプリを作ろうとか調べると何個か出る 5.テスト ・ここでRails tutorialを守備表示で特殊召喚(くどいからふぁーーーって流し読み) ・「何それ美味しいの?」から→「全然美味しくないやん」ってなったらおk 6.実際に作る ・チームのバックエンド組に合流 ・自分でウェブアプリ作ってみる ・クラウドソーシングで仕事探してみる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails ActiveStorageを用いての画像投稿方法

ActiveStorageの導入方法は前回の記事を参考に・・ https://qiita.com/on97-nakamatsu-mayumi/items/9ca9f3a081b3cf6289cf 画像を保存しよう Active Storageのテーブルに、画像を保存するための実装を行います。 保存したいテーブルのレコードと画像を紐づけるためにhas_one_attachedというメソッドを利用します 各レコードとファイルを1対1の関係で紐づけるメソッドです。 has_one_attachedメソッドを記述したモデルの各レコードは、それぞれ1つのファイルを添付できます。 【例】has_one_attachedメソッド class モデル < ApplicationRecord has_one_attached :ファイル名 end :ファイル名には、添付するファイルがわかる名前をつけましょう テーブルに画像ファイルを紐付けましょう テーブルとActive Storageのテーブルで管理された画像ファイルのアソシエーションを記述します。 ここでは例でMessagesテーブルに紐づけます app/models/message.rb class Message < ApplicationRecord belongs_to :room belongs_to :user has_one_attached :image validates :content, presence: true end 画像の保存を許可するストロングパラメーターにしましょう imageという名前でアクセスできるようになった画像ファイルの保存を許可する実装を行います。 ここではすでに作られストロングパロメーターに追加する感じです。 まだ紐付けるテーブルの保存実装をしていなく、ストロングパロメーターを作っていなければ1から作る app/controllers/messages_controller.rb # 中略 private def message_params params.require(:message).permit(:content, :image).merge(user_id: current_user.id) end 保存した画像を表示しよう 画像の表示には、HTMLのimg要素を使用しますが、今回はRailsのヘルパーメソッドであるimage_tagを使用して、簡単に画像を参照します。 image_tagメソッドでは、複雑なRailsのディレクトリパスを指定しなくても、モデルから画像ファイルを呼び出して引数に記述するだけで、画像を表示するimg要素を生成します。 例】image_tagメソッド # ファイルをモデルから指定する場合 <%= image_tag モデル.画像ファイル %> <%= image_tag user.avatar %> # app/assets/ディレクトリ下の画像ファイルパスでも指定できる <%= image_tag 画像ファイルのパス %> <%= image_tag "avatar.png" %> シンプルに記述できるため、ビューでは積極的にヘルパーメソッドを使用しましょう。 例えば以下のように記述します。 <div class="message"> <div class="upper-message"> <div class="message-user"> <!-- 投稿したユーザー名情報を出力する --> <%= message.user.name %> </div> <div class="message-date"> <!-- 投稿した時刻を出力する --> <%= l message.created_at %> </div> </div> <div class="lower-message"> <div class="message-content"> <!-- 投稿したメッセージ内容を記述する --> <%= message.content %> </div> <%= image_tag message.image, class: 'message-image' %> </div> </div> しかし、このままの記述では、画像が存在しない場合でも、画像を表示する記述が読み込まれて、エラーを引き起こしてしまいます。 この問題を解決するために、メッセージに画像が添付されているかをチェックするattached?というメソッドを使用します。 attached?メソッド レコードにファイルが添付されているかどうかで、trueかfalseを返すメソッドです。 ifを使って、要素の生成に条件をつけ、attached?メソッドで画像の添付をチェックします。 <div class="message"> <div class="upper-message"> <div class="message-user"> <!-- 投稿したユーザー名情報を出力する --> <%= message.user.name %> </div> <div class="message-date"> <!-- 投稿した時刻を出力する --> <%= l message.created_at %> </div> </div> <div class="lower-message"> <div class="message-content"> <!-- 投稿したメッセージ内容を記述する --> <%= message.content %> </div> <%= image_tag message.image, class: 'message-image' if message.image.attached? %> </div> </div> 注意するのが現時点の実装では、画像のみの投稿はできない 拡張子が「.png」または「.jpeg」の画像を投稿してください。 画像の大きさを調節しよう 表示される画像の大きさを調節する実装です。 画像の大きさを調節する方法はたくさんありますが、今回はvariantというメソッドを用いて画像の大きさの調節をします。 variantメソッド Active Storageを導入している場合に使用可能なメソッドです。 【例】variantメソッド モデル.ファイル名.variant(resize: '幅x高さ') 画像の横幅と高さを指定しましょう <div class="message"> <div class="upper-message"> <div class="message-user"> <!-- 投稿したユーザー名情報を出力する --> <%= message.user.name %> </div> <div class="message-date"> <!-- 投稿した時刻を出力する --> <%= l message.created_at %> </div> </div> <div class="lower-message"> <div class="message-content"> <!-- 投稿したメッセージ内容を記述する --> <%= message.content %> </div> <%= image_tag message.image.variant(resize: '500x500'), class: 'message-image' if message.image.attached? %> </div> </div>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails Active Storageの導入方法

rails で使用できるgem ActiveStorageの導入方法を書きます。 初心者の勉強用になります。 画像加工のために必要なImageMagickという画像変換ツールと、それをRailsから使うためのGemをインストールしましょう。 ImageMagick コマンドラインから画像に処理を加えることができるツールです。 処理としては、画像の作成やサイズ変更、保存形式の変更などがあります。 ImageMagickはGemではなく、ソフトウェアです。 そのため、Homebrewからインストールします。 GemではないImageMagickをRubyやRailsで扱うには、MiniMagickというGemが必要となります。 MiniMagick ImageMagickの機能をRubyで扱えるようにしてくれるGemです。 RailsでImageMagickを扱うために必要となります。 MiniMagickによって、ImageMagickの機能がRailsで使用できるようになりますが、画像サイズの変更には、もう1つImageProcessingというGemを追加する必要があります。 ImageProcessing MiniMagickでは提供できない、画像サイズを調整する機能を提供するGemです。 たくさんのツールとGemを紹介しましたが、それぞれの関係性は把握しておきましょう。 それでは、これらのツールとGemを導入します。 ImageMagickをインストールしましょう まずはImageMagickをHomebrewからインストールします。 brew install imagemagick Gemをインストールしましょう MiniMagickとImageProcessingをインストールします。以下のようにGemfileに追記しましょう。 # Gemfileの一番下に記述する gem 'mini_magick' gem 'image_processing', '~> 1 ターミナルでbundle installします。 bundle install もし、ローカルサーバーを立ち上げていたら、再起動させましょう。反映させる為になります。 Active Storageを使用する為に必要なツールのインストールは完了しました。 Active Storageをインストールしましょう Active Storageをアプリケーション内で使用する準備を行います。 rails active_storage:install rails active_storage:installコマンドを実行すると、Active Storageに関連したマイグレーションが作成されます。続けてマイグレートしましょう。 rails db:migrate Sequel Proを確認 Active Storageと画像加工ツールの導入は完了です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby 西暦を和暦に変換する方法

西暦を和暦に変換する方法 require 'date' date = Date.new(2021, 4, 24) NENGO_EIJI_KANJI = { 'M' => '明治', 'T' => '大正', 'S' => '昭和', 'H' => '平成', 'R' => '令和' } nengo = date.jisx0301.sub(/\A(.)0*(\d+).+/){ NENGO_EIJI_KANJI[$1] + $2 } puts nengo 先日、私の拙い記事に対して、コメントをいただき、西暦を和暦に変換する方法について教えていただいたので、学習した内容を整理するために記事にしてみました。 教えていただいたコードは上記のとおりで、Dateクラスとsubメソッドと正規表現を使用したものです。 subメソッド subメソッドは、文字列の中に指定した文字列や正規表現でマッチした文字列が存在した場合に、指定した文字列で置換を行ってくれます。 返り値には置換後の文字列が返されます。 str = "HTML Ruby CSS" puts str.(/CSS/, "JavaScript") # HTML Ruby JavaScript コードの可読性を上げるために、置換する文字列についてブロック形式で記載する方法もあります。 str = "HTML Ruby CSS" puts str.(/CSS/){"JavaScript"} # HTML Ruby JavaScript 正規表現 正規表現とは公式リファレンスによると、 正規表現は文字列のパターンを記述するための言語です。 また、この言語で記述されたパターンも正規表現と呼びます。 正規表現を用いると、文字列が指定したパターンを含んでいるかどうかを判定し、また含んでいるならばそれが文字列中のどの場所であるかを知ることができます。 と記載されています。 このリファレンスマニュアルをもとに、今回ご教示いただいた nengo = date.jisx0301.sub(/\A(.)0*(\d+).+/){ NENGO_EIJI_KANJI[$1] + $2 } を紐解いていきました。 間違っていたら、ご指摘願います。 まず、jisx0301メソッドで、西暦を和暦の英字表記に変換しています。 date.jisx0301 # R03.04.24 この「R03.04.24」に対して、subメソッドを使って、日本語表示の和暦に変換してあげます。 そのときに、正規表現にマッチした(/\A(.)0*(\d+).+/)を{ NENGO_EIJI_KANJI[$1] + $2 }に変換するようになっていますが、正規表現を使う場合は、//で囲ってやり、その中に正規表現を定義してあげます。 以下、\A(.)と0*(\d+)と.+に分けて正規表現を解説していきます。 \A(.) /Aは「文字列の先頭」を意味しており、今回の場合は「R」の部分に相当します。 ()はキャプチャする際に使われ、後ほど$1と記載された特殊変数によって呼び出すことができるようにするために使われます。 .は任意の1文字を意味しています。 ここまでをまとめると、\A(.)で「先頭の文字列をキャプチャ化した」という意味になります。 0*(\d+) *は直前の文字を0回以上繰り返す意味をもち、0*で「0が0回以上繰り返す」ことを意味しています。 ()は先程説明したキャプチャ化のためのもので、後に出てくる$2でこの部分を呼び出すことができます。 \dは[0-9]の整数を意味しており、+は1回以上繰り返すことを意味しているので、\d+で0~9の整数が1回以上繰り返されることを意味しています。 .+ 最後に.+についてですが、すでに説明した通り、.任意の1文字、+1文字以上繰り返されるということで、.+で「何か文字があるもの全て該当する」という意味になります。 (/\A(.)0*(\d+).+/)の意味 以上のことをまとめると、先の date.jisx0301 # R03.04.24 について、先頭の文字「R」をキャプチャ化して、年数である「03」の部分については「0」が入っている場合は、その部分はキャプチャ化せずに、つまりは、「03」、「02」等の場合は、「0」の部分は無視して、1以上の連続した整数についてはキャプチャ化しなさいということを(/\A(.)0*(\d+).+/)は意味していることになります。 { NENGO_EIJI_KANJI[$1] + $2 }の意味 $1や$2については、特殊変数と呼ばれ、パターンマッチしたときに、情報をセットすることができるものです。 前述のとおり、()を使うことで、キャプチャ化することができ、最初にキャプチャ化したものを$1で呼び出すことができます。 2番目にキャプチャ化したものは$2で呼び出されるわけです。 以上を踏まえると、{ NENGO_EIJI_KANJI[$1] + $2 }の意味は以下のように書き換えることができます。 { NENGO_EIJI_KANJI["R"] + "03" } という意味になり、 nengo = date.jisx0301.sub(/\A(.)0*(\d+).+/){ NENGO_EIJI_KANJI[$1] + $2 } # (/\A(.)0*(\d+).+/) => "R03.04.24" # { NENGO_EIJI_KANJI[$1] + $2 } => "令和3" puts nengo # "令和3" に変換され、年号の部分のみ西暦を和暦に変換できるコードが完成しました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Rails]simple_calenderの導入と実装

はじめに 簡単なカレンダー機能を実装したのでこちらでアウトプットします。 なお、コントローラやモデル、入力フォームといった部分は割愛しております。 成果物イメージ 実装 今回は、Simplecalendarというgemを導入して実装していきます 早速はじめていきましょう まずはgemを導入します。 gem 'simple_calendar', '~> 2.0' ※bundle installを忘れずに!!! 実は、極論これで完成といっても過言ではないです(笑) ビューには以下を記載します。 index.html.erb <%= month_calendar events: @events do |date, events| %> <%= date.day %> <% events.each do |event| %> <div class="title"> <%= event.title%> </div> <% end %> <% end %> 一行目のmonth_calendarの部分は月間カレンダーであることを示します。 ここを、週間カレンダーにしたい場合はweek_calendarとしてやればOKです。 なお、これらの詳しいビューについては以下のコマンドを叩くと生成できます。 rails g simple_calendar:views 個人的には、Googleの検証モードを使用してみてあげるのもわかりやすいかなと思います。 あとは、bootstrapの導入と個人的にCSS等で調整してあげれば成果物のような物が完成します。 個人的に苦しんだ部分を共有(CSS) 以上のようにカレンダー機能自体を実装することは簡単なのですが、デザインのところでかなり苦戦してしまいました。というのも、予定を入力した場合に、各日付のセル幅が、予定の内容の長さによって変わってしまい、カレンダーのデザインが崩れてしまいました。固定幅にするだけ!と鷹を括っていましたが、なぜかうまくいかず、、、 いろいろ調べてみたところ、以下のようにすると解決できました!! calendar.scss .table {  #省略 table-layout: fixed; } table-layoutでtableの列幅を指定します。fixedとするとことで、各列を均等の幅にしてくれます。 おわりに ざっくりとした導入の流れを記載いたしました。おそらく、触りながらの方が理解が早いかと思いますので、まずは実際にやってみることからお勧めします!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyでgemパッケージアプリを作成する

gemアプリを作ろう ruby でアプリケーションを作成して配布するとき、rb ファイルをzipで固めて配布するよりも gem化して配布した方がなんだかカッコイイ。rubygems に登録しないにしてもgem化しておけば、導入と破棄がとても簡単になる。gemパッケージを作る方法はいくつかあるが、ここではとてもシンプルな方法で作成してみている。 gemspec を作成する hoge アプリを作ってみる。最初に用意するのは gemspec ファイルだ。 hoge.gemspecより require 'rubygems' spec = Gem::Specification.new do |spec| spec.name = "hoge" spec.version = '0.1.0' spec.summary = "ruby package test." spec.description = %{ ruby package test examples.} spec.author = 'Iwao Watanabe' spec.email = 'iwao@users.sf.net' spec.homepage = 'http://sourceforge.net/users/iwao/' spec.files = Dir["lib/hoge.rb", "lib/hoge/*.rb"] spec.files.reject! { |fn| fn.include? "~" or fn.include? "CVS"} spec.required_ruby_version = '>= 1.9.0' puts spec.files end ここで重要なのは name と version と files だ。 name がパッケージ名で versionが世代を意味する。 filesで指定するファイルが用意すべきファイルだ。 取り急ぎはコマンドラインからサクッと作成する。 $ mkdir -p lib/hoge $ echo 'puts "aa!"' >> lib/hoge/aa.rb $ echo 'puts "hello!"' >> lib/hoge.rb gemファイルを作成する gemファイルを作成する。build コマンドでこのgemspecs を実行するだけだ。 $ gem build hoge.gemspec hoge-0.1.0.gem が生成されたら成功だ。 開発向けにgemをローカルインストール 作成したら早速インストールしよう。ただし開発のためにシステムには組み込まない。 作業ディレクトリ直下の vendor ディレクトリに組み込もう。 $ gem install hoge-0.1.0.gem -i vendor gem installed と表示されたら導入されている。 hogeパッケージが組み込まれていて動作するか確認してみよう。 $ GEM_HOME=vendor ruby -rhoge -e '' hello! $ 環境変数 $GEM_HOME に gem のインストール先の vendor を指定して、 -r オプションでパッケージロードを指定している。 -e '' で空文字を渡して実行している。 hoge.rb が読み込まれて hello! が出力された。 ちなみに hoge/aa.rb を動かすには -r で次のように呼び出す $ GEM_HOME=vendor ruby -rhoge/aa -e '' aa! $ gem導入先のvendor以下のファイルを編集 動作しているファイルをls で確認してみよう。 $ ls -R vendor/gems/hoge-0.1.0/lib hoge hoge.rb vendor/gems/hoge-0.1.0/lib/hoge: aa.rb $ このhoge.rb や hoge/aa.rb ファイルを編集して開発を進める。 次のような内容に修正してみよう。 hoge.rbより def args(args=nil) args = ARGV unless args args.each_with_index do |arg, i| puts "#{i}: #{arg}" end end args を定義してみた。これを動かすには -e オプションで指定すればよい $ GEM_HOME=vendor ruby -rhoge -e args aa bb cc 0: aa 1: bb 2: cc $ コマンドラインから渡されたパラメータが表示できている! 動作確認が終わったら.. vendor/gems 以下での振る舞いが満足のいく状況になったら、手元に戻してgemを再作成して確認しよう $ cp -pr vendor/gems/hoge-0.1.0/lib/ lib/ $ gem build hoge.gemspec $ gem install hoge-0.1.0.gem -i vendor2 $ GEM_HOME=vendor2 ruby -rhoge -e args aa bb cc 0: aa 1: bb 2: cc 2回目のインストールはさりげなく vendor2 に変えてます。 あとはgitにコミットするなり、gemファイルを知人に配布するなり、ご自由にどうぞ。 あっ。知り合いに渡すときには、使い方を説明するのは忘れないでくださいね
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails 6 でsemantic ui を使う

一. gemfileに追記 gem 'semantic-ui-sass' 二. bundle install bundle install 三. app/assets/stylesheet/application.scssに追記 @import "semantic-ui"; これでとりあえずは使える プルダウンなどはまた改めて
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

草野球の出欠確認Webアプリを作ろう! part.3

これから作っていく簡単なWebアプリの作成メモ(自分の備忘)です。 自分用なのであまり凝りすぎないように書いていきたい。 <<前回の記事 今回やったこと スケジュールコントローラーほかの生成 前回作成したScheduleモデルに対応するコントローラーやビューを作成していく。 あまりまとまった作業時間をとれていないので、ひとまず見た目や機能は気にしないで動くものを作っていこう。 (でも思いつきや寄り道は大事にしたいジレンマ、、、) $ bin/rails g controller Schedules index show new create edit update delete 生成されたルーティングを以下のように書き直す(個人の好みの問題)。 config/routes.rb Rails.application.routes.draw do # ルート root "users#index" # Users resources :users # Schedules resources :schedules end Users#indexのビューを作った時とほぼ同じものをコピペで作成した。 (以前views/users/index.html.erbを作った際にはif文の条件を@users.empty?としていたが、何か新しいアクションを追加したときにNoMethodErrorでシステムエラーを起こしたくないので@schedules.blank?として@schedulesがnilになってしまうことに備えた。) (本当は業務アプリでは上記のような「想定外を想定してゆるく作る」のはNGだと思うが、今回は遊びの面が強いのでなるべく作りの甘さが出ても動いてくれるようにしていきたい) views/schedules/index.html.erb <h1>チームの予定一覧</h1> <% if @schedules.blank? %> <div><%= "表示できる予定がありません。" %></div> <% else %> <div class="table_card"> <table align="center"> <thead> <tr> <th>件名</th> <th>予定日</th> </tr> </thead> <tbody> <% @schedules.each do |lst| %> <tr> <td><%= lst.title %></td> <td><%= lst.date_of %></td> </tr> <% end %> </tbody> </table> </div> <% end %> コントローラーも以下のように追記した。 controllers/schedules_controllers.rb def index @schedules = Schedule.all end ぎりぎり動く程度の実装はできたので、動作を確認する。 以下は動作確認のためのroot変更。 config/routes.rb # ルート # root "users#index" root "schedules#index" 上記によって、Railsサーバーに最初に接続したときのページがschedules/index.html.erbになる。 Rails6のデフォルトで、development環境ではプロファイラが表示される。 画面ハードコピーを取得する際に邪魔だったので、以下の記事を参考にAlt+pで非表示にした。 rails viewのプロファイラを非表示 他にも以下の記事のように、Railsサーバー起動時にデフォルトで表示されないようにできるらしい。 rack-mini-profilerの計測結果がWebページに表示しないようにする ふだんメインで使っているのはRails5.2.5なのでrack-mini-profilerを意識することがなかったが、かなり便利そうなので常時非表示にするのは惜しいと思いました。 そのため、rack-mini-profilerのREADMEを参考に、以下のようにして表示位置を右下にしてみた。 config/environments/development.rb require "active_support/core_ext/integer/time" Rails.application.configure do (中略) # rack-mini-profilerを右下に置く Rack::MiniProfiler.config.position = 'bottom-right' end 気に入ったので、しばらくこれでいってみようと思います。 (development.rbに記述した内容が反映されるのは、Railsサーバーの再起動時という点に注意) 今日も短いけどここまで。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

アプリの一括削除

初めに アプリケーションを作成している際に、DBに何かのエラーが出たが解決できず、一度全て削除し、再作成を試みました。 1.アプリケーションフォルダ内でDBの削除 $ rails db:drop 2.一つ上のフォルダに移動し、アプリの削除 $ cd .. $ rm -rf [削除したいアプリ名] 以上です。      
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む