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

RailsのViewの役割とRoutingについて

はじめに 基本は備忘録 MVCについて役割ごとにまとめる機会があったので整理します。 View htmlファイル 拡張子がsample.html.erb 新しいページを作成する (新たなコントローラとviewを作成 + routingの設定) # localhost:3000/home/topにアクセス可能 # 同じ名前のコントローラがすでにある場合コマンドが使えない rails generate controller コントローラ名 アクション名 rails g controller posts index link_to aタグに変換する。 # Prefixで設定 # rails routesでPrefixを確認 <%= link_to("文字列", post_path) %> # urlで指定 # /で始める routingに合わせる # postのroutingの時は{method: "post"} <%= link_to("文字列", "/posts") %> パーシャル 共通して使えるファイルを1つにまとめたもの パーシャルとして使うファイル名は_sample.erbのように_から始める # 呼び出し方 読み込ませる時は「_」がいらない # 第3引数に post: @postで変数も渡せる <%= render "dir_name/file_name"%> formを作成する # view側の設定 # form_tag(送り先のURL)でフォームの送信先を指定 # textareaのname属性をキーにして、ハッシュでアクションに送る <%= form_tag("/posts/create") do %> <textarea name="content"></textarea> <input type="submit" value="投稿"> <% end %> Routing resources :postsとすることで、基本となる7つのアクションへのルーティングを自動的に設定する get "URL" => "コントローラ名#アクション名" get "/" => "home#top" # railsデフォルトのページ無くす get "about" => "home#about" #home contのaboutを使う resources :posts # クラッドの7つのアクションを一括設定 # ルーティングは上から実行される 書く順番に気をつける # 以下の順番はよくない例だが、わかりやすくするためこの順番にしている get "posts/index" => "posts#index" get "posts/new" => "posts#new" post "posts/create" => "posts#create" get "posts/:id" => "posts#show" get "posts/:id/edit" => "posts#edit" post "posts/:id/update" => "posts#update" post "posts/:id/destroy" => "posts#destroy" URLにidを含ませる方法は下記 # view側のlinkのurlにidを混ぜる ## post.idの部分がparamsにハッシュで保存される <%= link_to(post.content, "/posts/#{post.id}") %> 設定済みrouting情報を確認 rails routes
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsのControllerの役割

はじめに 基本は備忘録 MVCについて役割ごとにまとめる機会があったので整理します。 Controller ModelやViewとdateのやりとりをする CRUD(クラッド)処理 システムに必要な4つの主機能 C Create # データの作成 R Read # データの読み込み U Update # データの更新 D Delete # データの削除 railsは7つを推奨している index # データの一覧を表示する new # データを新規作成するためのフォームを表示 create # データを新規作成し、データーベースへ保存 show # 指定したデータを表示 edit # データを更新するためのフォームを表示 update # データ更新 destroy # データ削除 一覧データの表示と作成 index # DBから全てのデータ(@posts)を取得しViewに返却 #.order(created_at: :desc)で並び替え @posts = Post.all new # インスタンス変数(@post)を作成し、それをViewへ返却 @post = Post.new create # Viewからの送信値(params)を元にデータを作成し、DBへ保存 # formの内容をparamsを使って取得している @post = Post.new(params[:xx]) @post.save Post.create(params[:xx]) データの更新と削除 show # 投稿の詳細を表示 # Viewからの送信値(params)を元にデータを探し、それをViewへ返す @post = Post.find(params[:id]) edit # Viewからの送信値(params)を元にデータを探し出し、Viewに返却 # View側でデータを更新するためのフォームを表示 @post = Post.find(params[:id]) update # Viewからの送信値(params)を元にデータを更新します @post = Post.find(prams[:id]) @post.update(params[:id]) destroy # Viewからの送信値(params)を元にデータを探し出し、削除 @post = Post.find(params[:id]) @post.destroy 応用機能4つ before_action アクションが実行される前に何らかの処理を行う # postsコントローラで共通させたい処理 # postsコントローラでbefore_actionを記述 # 全てのコントローラで共通させたい処理 # applicationコントローラに記述 before_action :set_current_user def set_current_user @current_user = User.find_by(id: session[:user_id]) end # 特定のアクションで利用 # Application..で定義したメソッドは # 継承元で定義したメソッドなので利用できる before_action :authenticate_user, {only: [:edit, :update]} strong Parameter form等からの不必要な情報を受け付けないように設定できる ハッキング対策 params.require(:モデル名).permit(:カラム名, :カラム名2) フラッシュメッセージ # 次のアクションまで表示 flash[:notice] = "表示したい文字列" ## 失敗した時 flash.now[:notice] = "表示したい文字列" # view側 application... <body>最上部 # flashメッセージがある時のみ表示する <% if flash[:notice] %> <div class="flash"> <%= flash[:notice] %> </div> <% end %> redirect_to / render controllerの経由回数が違うのでflashの使い方に気をつける redirect_to # レダイレクトする 引数はrouting redirect_to("/posts/index") render # 他のactionを経由せず、現在のactionの@変数を使える # renderはrender("フォルダ名/ファイル名") render("posts/edit")
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RailsのModelの役割

はじめに 基本は備忘録 MVCについて役割ごとにまとめる機会があったので整理します。 Model modelの役割はDB関連の処理 date取得などの処理や、date自体の作成・削除 新しいテーブルを作成 モデル・マイグレーションファイルが作成される db/migrate/配下にmigrationファイル app/models/配下にモデル # DBに変更を指示するmygration fileを作成 # カラムが複数個ある場合は,は不要 name:string mal:string rails generate model Post content:text # DBに変更を反映 id, created_at, updated_at, は自動生成 rails db:migrate # データ型 integer 整数 float 少数 string 文字列 text 長い文字列 boolean 真偽値 既存のtableにカラムを追加する db/migrate配下 # migrationファイルのみを作成 # 中身を記述 # rails db:migrate rails g migration ファイル名 # 関連ある名前にする migrationファイルの内容を記述 def change # ここに処理 # 既存のテーブルにカラムを追加する add_column :table名, :column名, :データ型 end バリデーションを設定 不正なデータがDBに保存されないようにする仕組み モデルで設定する app/models/配下 # validates :検証するカラム, {検証内容} カラム別に設定 # 空なら弾く, 文字数制限140字 validates :content, {presence: true, length: {maximum: 140}} # 重複した登録を防げる validates :email, {uniqueness: true} presence: true #=> 値が存在しているかを確認 uniqueness: true #=> 値が重複していないか length: {minimum:4} length: {maximum:16} format: {widh: 正規表現} #=>値のフォーマットを指定 inclusion: {in: [draft]} # 値の候補を指定 エラーメッセージを表示 form_tagのtextareaの上に配置。 エラーがない場合は何も表示されない # saveメソッドでvalidationに失敗すると、error messageが自動で生成される # @post.errors.full_messagesの中に配列で入る # view側でeach文を使ってエラー文を表示する <% @post.errors.full_messages.each do | message | %> <%= message %> <% end %> データを操作 # rails consoleや action内で取得する post = Post.new(name: '田中', age: 18) post.save # 変数 = モデル名.条件 post = Post.first post1 = Post.all post2 = Post.all[0].content post3 = Post.find_by(id: 1) post4 = Post.find(1) post.destroy
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby on Rails]いいね、お気に入り機能の実装

はじめに お気に入り機能を実装する際に迷うことがあったため、アウトプットもかねて自分なりにまとめてみました。 前提 下のようなER図にて、お気に入り機能を実装する。 すでに、userの新規登録及びgadjetの投稿、一覧画面、詳細画面の実装は済んでいる。 ・Userはgadjetに対して、一つのお気に入りをすることができる ・Userとfavoriteは"1対多"の関係 ・gadjetとfavoriteは"1対多"の関係 開発環境 ruby '3.0.0' Rails 6.0.3.4 実装手順 favoriteモデルの作成 上記ER図のように、モデルを作成する。 ターミナル rails g model favorite user_id:integer gadjet_id:integer マイグレーションファイルが正しく作成されているか、確認してから ターミナル rails db:migrate DBに反映させる。 モデル同士の紐付け belongs_toとhas_many - belongs_toとhas_manyは共にモデルファイルに記述をする - 「1対多」の関係に置いて「1」である方にhas_manyを記述する - 「1対多」の関係に置いて「多」である方にbelongs_toを記述する app/models/favorite.rb class Favorite < ApplicationRecord belongs_to :user belongs_to :gadjet validates_uniqueness_of :gadjet_id, scope: :user_id end 「1対多」の関係に置いて「多」である方にbelongs_toを記述する。その際、単数系にすることに注意する。 「1ユーザが1つのガジェットにお気に入りをできるのは1回まで。」というバリデーションを、下記記述でかけている。 (gadjet_idとuser_idのセットをユニークにすることで) validates_uniqueness_of :gadjet_id, scope: :user_id app/models/gadjet.rb class Gadjet < ApplicationRecord belongs_to :category, dependent: :destroy belongs_to :user has_many :favorites, dependent: :destroy has_one_attached :image end has_many :favorites, dependent: :destroy 「1対多」の関係に置いて「1」である方にhas_manyを記述する。その際、複数形にすることに注意する。 紐づいた"gadjet"が削除された際に、お気に入りも削除されるように、「dependent: :destroy」を記述する。 app/models/user.rb class User < ApplicationRecord belongs_to :category, dependent: :destroy belongs_to :user has_many :favorites, dependent: :destroy has_one_attached :image end ユーザモデルにも同様に記述する。 favorites controller の作成 ターミナル rails g controller favorites コントローラでは、以下のアクションを記述する。 ・create:お気に入りをする ・destroy:お気に入りを取り消す app/controllers/favorites_controller.rb class FavoritesController < ApplicationController def create @favorite = current_user.favorites.create(gadjet_id: params[:gadjet_id]) redirect_back(fallback_location: root_path) end def destroy @gadjet = Gadjet.find(params[:gadjet_id]) @favorite = current_user.favorites.find_by(gadjet_id: @gadjet.id) @favorite.destroy redirect_back(fallback_location: root_path) end end 「current_user.favorites.create」→ current_userに紐づいた"favorite"を作成している。 (favoriteテーブルのuser_idにカレントユーザidが入っている事になる) "gadjet_id"には、paramsで指定したgadjet_idが入る。 「redirect_back(fallback_location: root_path)」→直前のページにリダイレクトする。 お気に入りした際に、一覧画面、詳細画面のそれぞれにリダイレクトするようにするため。 destroyについても同じ容量で記述する。 ルーティングの作成 以下のように、ルーティングを設定する。 config/routes.rb resources :gadjets do resource :favorites, only: [:create, :destroy] end お気に入りをする一覧画面、詳細画面のアクションがあるコントローラのルーティングで記述。 (私の場合は、boardsコントローラがそれに当たる) view画面の作成にて、create,destroyのパスは使用するため、確認しておく。 お気に入り済みか判定するメソッドを作成 app/models/user.rb class User < ApplicationRecord belongs_to :category, dependent: :destroy belongs_to :user has_many :favorites, dependent: :destroy has_one_attached :image def already_favorite?(gadjet) self.favorites.exists?(gadjet_id: gadjet.id) end end 「self.favorite.exists?(gadjet_id: gadjet.id)」 →カレントユーザに紐位づいている"gadjet"の中で、favoriteテーブルの"gajet_id"の中に、お気に入りしようとしているガジェットのID"gajet.id"が存在しているか を判定している。(selfには、current_user.idが入ると考える) viewファイルにお気に入りボタンの実装 お気に入りを実装するviewファイル.html.erb <% if current_user.already_favorite?(@gadjet) %> #上で作成したメソッドを使用 <%= button_to gadjet_favorites_path(@gadjet), method: :delete do %> #すでにお気に入りだったらdestroy <i class="fas fa-thumbs-up good"></i>  <% end %> <%= @gadjet.favorites.count %> #お気に入りの数をカウント <% else %> <%= button_to gadjet_favorites_path(@gadjet.id), method: :post do %> #お気に入りでなかったらcreate <i class="far fa-thumbs-up good"></i> <% end %> <%= @gadjet.favorites.count %> <% end %> 自分は、font awesomeを使用してgoodボタンにしていますが、ハートでいいねやその他アイコンで様々な表現ができると思います。 (例) 終わりに 少しでも参考になれば幸いです。 また、間違い等がありましたら、コメントにてご指摘をお願いいたします。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】今日の曜日を表示するコード Dateクラス

※初心者向け ※アウトプット練習の為 開発環境 rails 6.1.4.1 ruby 2.6.5 問題内容 今日の曜日を表示するコードをDateクラスを使用して記述してください。 ただし、金曜日だった場合だけ以下のように表示の内容を変えてください。 (出力内容) 「今日は水曜日」 「今日は金曜日だ !!!」 ヒント Dateクラス DateクラスとはRubyの標準ライブラリの機能です。Dateクラスを使うには以下一文を記述します。 require "date" 次に、Dateクラスを用いて「今日の曜日」を取得する場合は以下のように記述します。 Date.today.wday wdayは曜日を0(日曜日)から6(土曜日)の整数で取得することができるDateクラスに用意されているメソッドです。 たとえば、以下のように使うことができます。 require "date" day = Date.today.wday puts day これを実行すると、曜日に合わせた数字が出力されます。たとえば、木曜日だとすれば4が出力されることになります。 解答 require "date" day = Date.today.wday days = ["日曜日", "月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日"] if day == 5 puts "今日は#{days[day]}だ!!!" else puts "今日は#{days[day]}" end 解説 今回はRubyで日付を扱うため、RubyのライブラリにあるDateクラスを使用します。 (1行目)Dateクラスをライブラリから呼び出します。 (3行目)wdayメソッドを用いて曜日を0(日曜日)から6(土曜日)の整数にしたときの「今日」の値を取得します。 (4行目)配列daysを定義し、日曜日(0番)〜土曜日(6番目)まで文字列を格納します。 (6〜10行目)dayの値が5(金曜日)か否かで条件分岐させます。たとえば、今日が金曜日だった場合はday=5となり、daysの5番目の値である金曜日が出力されるようになります。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby]条件式付きの繰り返し処理(while文)

学習したことのアウトプットとして while文 繰り返し処理を行うためのRubyの構文で、指定した条件が真である間処理を繰り返す   基本構文 while 条件式 do # doは省略可 # 条件が真である時に繰り返す処理 end 例)1〜10までの数字を出力させる num = 0 while num <= 10 puts num num += 1 end # ターミナル出力結果 # 0 # 1 # 2 # 3 # 4 # 5 # 6 # 7 # 8 # 9 # 10 無限ループに注意! 例えば上記のコードの条件式を「true」にすると無限にターミナルに出力されて、コンピュータに大きな負担がかかってしまうので注意が必要 breakを使ってループを抜け出す 例 number = 0 while number <= 10 if number == 5 break end puts number number += 1 end # ターミナル出力結果 # 0 # 1 # 2 # 3 # 4 上記のコードでは、if文とbreakを追加しています。 すると、実行結果を見てもわかる通り、出力結果は4で止まる。   まとめ while文は条件式が真の間、処理をループさせることができる ループを抜けるためにはbreakを使用する     ※補足等があればコメントいただけると幸いです  
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[py2rb] itertools.product

はじめに 移植やってます。 ( from python 3.7 to ruby 2.7 ) product (Python) import itertools A = [('a', 'b', 'c'), ('d', 'e'), ('f', 'g')] print(list(itertools.product(*A))) # [('a', 'd', 'f'), ('a', 'd', 'g'), ('a', 'e', 'f'), ('a', 'e', 'g'), ('b', 'd', 'f'), ('b', 'd', 'g'), ('b', 'e', 'f'), ('b', 'e', 'g'), ('c', 'd', 'f'), ('c', 'd', 'g'), ('c', 'e', 'f'), ('c', 'e', 'g')] ジェネレータ式の入れ子になった for ループとおよそ等価です。たとえば product(A, B) は ((x,y) for x in A for y in B) と同じものを返します。 ふむふむ。 product 失敗 (Ruby) A = [['a', 'b', 'c'], ['d', 'e'], ['f', 'g']] print(A.inject(:product)) # [[["a", "d"], "f"], [["a", "d"], "g"], [["a", "e"], "f"], [["a", "e"], "g"], [["b", "d"], "f"], [["b", "d"], "g"], [["b", "e"], "f"], [["b", "e"], "g"], [["c", "d"], "f"], [["c", "d"], "g"], [["c", "e"], "f"], [["c", "e"], "g"]] 単に、injectすると、平坦化されていない状態で出力されます。 product + flatten 成功 (Ruby) A = [['a', 'b', 'c'], ['d', 'e'], ['f', 'g']] print(A.inject(:product).map(&:flatten)) # [["a", "d", "f"], ["a", "d", "g"], ["a", "e", "f"], ["a", "e", "g"], ["b", "d", "f"], ["b", "d", "g"], ["b", "e", "f"], ["b", "e", "g"], ["c", "d", "f"], ["c", "d", "g"], ["c", "e", "f"], ["c", "e", "g"]] tupleではないのですが、同様の処理ができました。 product 応用問題 (Python) import itertools A = [(('H-', 'a'), 'b', 'c'), ('d', 'e'), ('f', 'g')] print(list(itertools.product(*A))) # [(('H-', 'a'), 'd', 'f'), (('H-', 'a'), 'd', 'g'), (('H-', 'a'), 'e', 'f'), (('H-', 'a'), 'e', 'g'), ('b', 'd', 'f'), ('b', 'd', 'g'), ('b', 'e', 'f'), ('b', 'e', 'g'), ('c', 'd', 'f'), ('c', 'd', 'g'), ('c', 'e', 'f'), ('c', 'e', 'g')] 前回は、要素が一つずつでしたが、今回は要素数が異なります。 product 応用問題 (Ruby) A = [[['H-', 'a'], 'b', 'c'], ['d', 'e'], ['f', 'g']] print(A.inject(:product).map(&:flatten)) # [["H-", "a", "d", "f"], ["H-", "a", "d", "g"], ["H-", "a", "e", "f"], ["H-", "a", "e", "g"], ["b", "d", "f"], ["b", "d", "g"], ["b", "e", "f"], ["b", "e", "g"], ["c", "d", "f"], ["c", "d", "g"], ["c", "e", "f"], ["c", "e", "g"]] print(A.inject(:product).map{ _1.flatten(1) }) # 1 print(A[0].product(*A[1..-1])) # 2 # [[["H-", "a"], "d", "f"], [["H-", "a"], "d", "g"], [["H-", "a"], "e", "f"], [["H-", "a"], "e", "g"], ["b", "d", "f"], ["b", "d", "g"], ["b", "e", "f"], ["b", "e", "g"], ["c", "d", "f"], ["c", "d", "g"], ["c", "e", "f"], ["c", "e", "g"]] 単なるflattenですと平坦化しすぎですので、深さを指定します。 2番目の書き方は、こちらを参照しました。 メモ Python の itertools.product を学習した 百里を行く者は九十里を半ばとす
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Railsの環境構築【初心者用】

動機 シンプルに手順を示した記事が無かったため作成。 できる限りシンプルにまとめました! とりあえず手元のPCでRailsを動かせるようになることを目的としていますので細かい説明は省略しています。 環境構築が終わってから、コマンドで具体的に何を行っているのか、一つずつ調べていきましょう。 環境 macOS Monterey 12.1 ひたすらインストールしていく ターミナルを開いてコマンドを入力していってください。 Command Line Tools コマンドラインツール xcode-select --install Homebrew macのパッケージ管理ツール /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" rbenv Rubyのバージョン管理ツール brew update brew install rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshrc echo 'eval "$(rbenv init -)"' >> ~/.zshrc source ~/.zshrc Ruby プログラミング言語のRuby 3.0.3はバージョンを示しています。 3.0.3がインストールできない場合はrbenv install -lで表示されるバージョンを指定してください。 rbenv install -l rbenv install 3.0.3 rbenv global 3.0.3 bundler Gem(ライブラリ)のバージョン管理ツール gem install bundler yarn Rails内におけるJavaScriptのバージョン管理ツール brew install yarn Ruby on Rails Webアプリケーションフレームワーク gem install rails --no-document 動作確認して完了! 以下のコマンドを実行します(数分程かかります) rails new sample_app cd sample_app rails server # Ctrl+Cで停止 ブラウザ(chromeでもsafariでもOK)のURL欄に http://localhost:3000 と入力して、以下のような画面が表示されれば環境構築成功です!お疲れさまでした! 最後のコマンドはサーバーを起動するコマンドです。 Ctrl + C で停止しておきましょう。 動作確認用アプリの削除は以下のコマンド。 cd .. rm -rf sample
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubocopを使って、Rubyのマジックコメントを coding: utf-8 から frozen_string_literal: true に修正する(一括置換)

Rubyのマジックコメントを、# -*- coding: utf-8 -*- から # frozen_string_literal: true に一気に書き換えたい場合、以下の2つのコマンドを流せば、そのディレクトリ以下にあるRubyのすべてのファイルで、マジックコメントが encoding: utf-8 から frozen_string_literal: true に書き換えられる rubocop --only Style/Encoding -a rubocop --only Style/FrozenStringLiteralComment -a -a オプションを削除して実行すると、ファイルは変更されずに変更箇所のリストアップだけされるので、最初はそれで試してみるのが良いかも 参考 Class: RuboCop::Cop::Style::Encoding — Documentation for rubocop (1.24.1) Class: RuboCop::Cop::Style::FrozenStringLiteralComment — Documentation for rubocop (1.24.1)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby] 丸め誤差というバグについて簡単に説明

丸め誤差とは コンピューターの内部で10進数ではなく、2進数で計算すると発生するのが丸め誤差です。 「有限桁で数を表そうとするから」と捉えたほうがいい↑ Rubyに備わっているirbを使って確認してみましょう irb(main):001:0> 0.1*3.0 => 0.30000000000000004 上記のように0.3になりません。 このような誤差のバグで正しく処理できないことがあります          ↑不可避 以下が例です。 数値の大小を比較したりする際にバグになる irb(main):002:0> 0.1*3.0 == 0.3 => false irb(main):003:0> 0.1*3.0 <= 0.3 => false trueではなくfalseが返っています。 こうなると正しく計算ができませんよね 対処法 Rationalクラスを使う 先ほどの計算にRationalクラスを使ってみましょう 数字に後に'r'を付けます。 irb(main):004:0> 0.1r*3.0r == 0.3 => true irb(main):005:0> 0.1r*3.0r <= 0.3 => true 無事trueが返ってきました! おさらい Rationalクラスは有理数を表すことができる 小数点を使わない計算をすることで、バグを回避できます。 おわりに 最後まで読んでいただいた方ありがとうございます。 何かあればご教授いただけますと嬉しいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

active_hashを使って都道府県モデルを作る方法

はじめに    今回は都道府県を選択する時に使う「active_hash」について新たに学んだので備忘録としてまとめます。active_hash住所などを選択する時に都道府県を選択するプルダウンを作るために必要です。ユーザー登録をする時にはよく使いますが、47個の都道府県を毎回実装するのは大変です。そんな時に、active_hashを使うと簡単に効率よく実装する事ができます。 active_hashの実装方法 active_hashの実装方法は以下の手順です。 1gemfile 2疑似モデルを作る 3対応するカラムを作る 4アソシエーションを定義する です。 今回はuserモデルに都道府県を保持させたい場合を想定します それでは順番に説明していきます。 gemfileの導入  まずはgemfileを導入します。 ## Gemfileに以下を記述 gem 'active_hash' その後bundle installを忘れずします。 都道府県の擬似モデルを作る  次に都道府県を入れた擬似モデルを作ります まずは実施のコードをご覧ください prefecture.rb class Prefecture < ActiveHash::Base self.data = [ { id: 1, name: '--' }, { id: 2, name: '北海道' }, { id: 3, name: '青森県' }, { id: 4, name: '岩手県' }, { id: 5, name: '宮城県' }, { id: 6, name: '秋田県' }, { id: 7, name: '山形県' }, { id: 8, name: '福島県' }, { id: 9, name: '茨城県' }, { id: 10, name: '栃木県' }, { id: 11, name: '群馬県' }, { id: 12, name: '埼玉県' }, { id: 13, name: '千葉県' }, { id: 14, name: '東京都' }, { id: 15, name: '神奈川県' }, { id: 16, name: '新潟県' }, { id: 17, name: '富山県' }, { id: 18, name: '石川県' }, { id: 19, name: '福井県' }, { id: 20, name: '山梨県' }, { id: 21, name: '長野県' }, { id: 22, name: '岐阜県' }, { id: 23, name: '静岡県' }, { id: 24, name: '愛知県' }, { id: 25, name: '三重県' }, { id: 26, name: '滋賀県' }, { id: 27, name: '京都府' }, { id: 28, name: '大阪府' }, { id: 29, name: '兵庫県' }, { id: 30, name: '奈良県' }, { id: 31, name: '和歌山県' }, { id: 32, name: '鳥取県' }, { id: 33, name: '島根県' }, { id: 34, name: '岡山県' }, { id: 35, name: '広島県' }, { id: 36, name: '山口県' }, { id: 37, name: '徳島県' }, { id: 38, name: '香川県' }, { id: 39, name: '愛媛県' }, { id: 40, name: '高知県' }, { id: 41, name: '福岡県' }, { id: 42, name: '佐賀県' }, { id: 43, name: '長崎県' }, { id: 44, name: '熊本県' }, { id: 45, name: '大分県' }, { id: 46, name: '宮崎県' }, { id: 47, name: '鹿児島県' }, { id: 48, name: '沖縄県' } ] end このようにして都道府県の擬似モデルを作ります。 ここで注意してもらいたいのが、 「class Prefecture < ActiveHash::Base」の部分です。 ActiveHash::Baseという記述は、あるモデルの中でActiveHashを使うために必要となるクラスです。 ActiveHash::Baseを継承することで、ActiveRecordと同じようなメソッドを使用できるようになります。 従って今回の例で言うと、user.prefecture.nameであるuserの出身地をとってくる事ができます。 適用したいモデルに、prefecture_idカラムを作る  次に都道府県を使用したいモデルにprefecture_idカラムを追加します。 今回はuserのマイグレーションファイルに記述します。 t.integer :prefecture_id, null: false 注意点としては、 ・id値が数値なのでintegerを指定する事 ・カラム名に_idをつける事です このようにする事で、userに紐づく都道府県をとってくる事ができます。 アソシエーションの設定  次にuserモデルとprefectureモデル間でのアソシエーションを設定します まずはuserモデルです。 user.rb class User < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :prefecture end userは必ず一つの都道府県に紐づいているので、prefectureに対してbelongs_toの関係です。 ここで注意点はextend ActiveHash::Associations::ActiveRecordExtensionsと記述してモジュールを取り込んでいる事です。 次にprefectureモデルです。 prefecture.rb class Prefecture < ActiveHash::Base self.data = [ { id: 1, name: '--' }, { id: 2, name: '北海道' }, { id: 3, name: '青森県' }, { id: 4, name: '岩手県' }, { id: 5, name: '宮城県' }, { id: 6, name: '秋田県' }, { id: 7, name: '山形県' }, { id: 8, name: '福島県' }, { id: 9, name: '茨城県' }, 〜〜中略〜〜 ] include ActiveHash::Associations has_many :items end 都道府県は複数のuserに紐づくので、userに対してhas_manyの関係です。 注意点としてはinclude ActiveHash::Associationsと記述してモジュールを取り込んでいる事です。   以上ここまでで都道府県モデルを作る事ができした。 まとめ  今回はactive_hashを使って都道府県モデルを作る方法についてまとめました。  active_hashを使う利点としては固定値の使い回しができる事です。都道府県はuser以外にもいろいろな場面で使われます。そのような時に都道府県モデルがあると、効率的に実装を進める事ができます。 以上今回の記事が少しでも誰かのお役に立てれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【CircleCI】bundle installされない場合の対処方法

railsでポートフォリオ作成時にCircleCIを導入したところ、 bundle exec rails db:migrate実行時にエラーが発生しました。 ログ上ではbundle installしてたがbundle installしろとのこと。。。 ググっても解決策が見つからず、かなりハマってしまったので記録しておきます。 エラー内容 エラーメッセージ Could not find rake-13.0.6 in any of the sources Run `bundle install` to install missing gems. 解決策 プレフィックスが「 circleci / 」のレガシーイメージは、 2021 年 12 月 31 日に廃止されます。 ビルドを高速化するには、次世代の CircleCI イメージを使ってプロジェクトをアップグレードしてください。 引用元 とのことだったので、config.yml で指定しているDockerイメージを下記のように修正したら解決しました。 .circleci/config.yml version: 2.1 orbs: ruby: circleci/ruby@1.1.2 jobs: build: docker: + - image: cimg/ruby:2.7.5 - - image: circleci/ruby:2.7.5 working_directory: ~/app/src steps: - checkout: path: ~/app - ruby/install-deps test: docker: + - image: cimg/ruby:2.7.5 - - image: circleci/ruby:2.7.5 - image: circleci/postgres:13.5 environment: POSTGRES_USER: postgres POSTGRES_HOST_AUTH_METHOD: trust POSTGRES_DB: app_test environment: BUNDLE_JOBS: "3" BUNDLE_RETRY: "3" APP_DATABASE_HOST: "127.0.0.1" RAILS_ENV: test working_directory: ~/app/src steps: - checkout: path: ~/app - ruby/install-deps - run: name: Database setup command: bundle exec rails db:migrate - run: name: test command: bundle exec rake test workflows: version: 2 build_and_test: jobs: - build - test: requires: - build
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

crontab×ruby 備忘録

経緯 crontab で ruby のスクリプトを動かすことに苦戦したので、 忘れないようにメモ。 参考記事 実行環境 ・cent os (ヴァージョン追記予定) シェルスクリプトの作成 参考記事に倣って作成する。 crontabの設定 crontabは環境変数が通っていないため、crontabで使いたい環境変数は自分で通す必要がある。 crontab -e の編集画面で、 PATH, HOME, RBENV_ROOT,RBENV_SHELL,SHELLなど通すことで、 crontab で ruby のスクリプトが動かせるようになった。 (LANG も通しておかないと、実行ログが文字化けしてました)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む