20210725のRubyに関する記事は18件です。

モデルの作成、カラムの追加・削除の仕方 [Ruby on Rails]

モデル作成 terminal $ rails generate model [モデル名] [属性名:データ型 属性名:データ型・・・] [オプション] $ rails generate model User name:string email:string #最後忘れずに更新 $ rails db:migrate コマンドを実行すると以下の4つが自動生成されます。 ・モデルのクラスファイル ・マイグレーションファイル ・モデルの自動テスト ・モデルの自動テストで使うfictureファイル カラムの追加 terminal $ rails g migration Addカラム名Toモデル名 カラム名:データ型 $ rails generate migration AddNicknameToUsers nickname:string #最後忘れずに更新 $ rails db:migrate カラムの削除 terminal $ rails generate migration Removeカラム名Fromモデル名 カラム名:データ型 $ rails generate migration RemoveNameFromUsers name:string #最後忘れずに更新 $ rails db:migrate 引用 : Rails /テーブル作成、カラムの追加や削除[備忘録]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

モデルの作成・削除、カラムの追加・削除の仕方 [Ruby on Rails]

データベース、テーブル、カラム、レコードの意味 この画像にないモデルは、テータベースの設計図であり、テーブルの総称と考えていいでしょう。 引用 : Railsにおけるモデルについて モデル(テーブル)の作成 terminal $ rails generate model [モデル名] [カラム名:データ型 カラム名:データ型・・・] [オプション] $ rails generate model User name:string email:string #最後忘れずに更新 $ rails db:migrate コマンドを実行すると以下の4つが自動生成されます。 ・モデルのクラスファイル ・マイグレーションファイル ・モデルの自動テスト ・モデルの自動テストで使うfictureファイル データ型の種類 string : 文字列 text : 長い文字列 integer : 整数 decimal : 小数 datetime : 日時 binary : バイナリデータ boolean : Boolean モデル(テーブル)の削除 terminal $ rails destroy model [モデル名] $ rails destroy model User #最後忘れずに更新 $ rails db:migrate カラムの追加 terminal #モデル名が複数形 $ rails g migration Addカラム名Toモデル名s カラム名:データ型 $ rails generate migration AddNicknameToUsers nickname:string #最後忘れずに更新 $ rails db:migrate カラムの削除 terminal #モデル名が複数形 $ rails generate migration Removeカラム名Fromモデル名s カラム名:データ型 $ rails generate migration RemoveNameFromUsers name:string #最後忘れずに更新 $ rails db:migrate 引用 : Rails /テーブル作成、カラムの追加や削除[備忘録]
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby-FFIで構造体のビットフィールド(bit field)を読み書きできるgemをつくりました

はじめに Ruby-FFI とは Ruby-FFIはlibffiを使ってRubyでC言語のライブラリのバインディングを作成する有力なツールです。 Ruby-FFI はビットフィールド未対応だった しかし、2021年7月現在、Ruby-FFIは構造体のビットフィールドをサポートしていません。ビットフィールド未対応であることはWikiにも記載されていますし、issueで開発者の方にも直接確認して、たしかに対応していないという返事をいただきました。 筆者の見聞によるとC言語の ビットフィールドへのサポートが進んでいないのはRuby言語に限った話ではないので、ある意味仕方がないことではあります。もしもビットフィールドが一部に使われているだけであれば、その都度カスタムメソッドを用意すれば十分だと思います。しかしターゲットとしているC言語のライブラリのあちこちでビットフィールドが利用されているとなるとその都度カスタムのメソッドを用意するのはとても手間がかかります。gemを作成して一気に解決したくなります。 私は ruby-htslib というバイオインフォマティックス関連のバインディングを作成しています。htslibはライブラリ全体でビットフィールドが多用されているためビットフィールドへの対応が避けられません。しかし、大量のカスタムメソッドを書くのはなんとかして避けたいと思いました。 ffi-bitfield GEMを作った そこで、Ruby-FFIでビットフィールドを扱うためのgemを作成しました。 ビット演算については全然わからなかったので、ウンウン数時間かけて考えてなんとか初歩的な部分を理解しました。それでも自力で効率的なコードを書くことはできなかったので、Ruby-JPのslackに質問したり、スタックオーバーフローに質問したりしてほかの人にコードを書いてもらいました。こういうときにインターネットのコミュニティーは本当に頼りになると思います。 実装はピュアRubyで書かれており、[]= メソッドや [] メソッドを挙動を変更するようになっています。C言語やFFIのレベルでどうこうするものではありません。 インストール FFI以外の依存は特にありません。 gem install ffi-bitfield 使い方 require 'bit_structs とすると FFI::BitStruct と FFI::ManagedBitStruct が使えるようになります。 require 'ffi/bit_structs' require 'ffi/bit_struct' # FFI::BitStruct だけ使いたいとき require 'ffi/managed_bit_struct' # FFI::ManagedBitStruct だけ使いたいとき 構造体とビットフィールドは次のような感じで定義します。 bit_field と bit_fields は同じ挙動で、メソッドの別名です。 require 'ffi/bit_struct' class Struct1 < FFI::BitStruct layout \ :a, :uint8, :b, :uint8 bit_fields :a, :a0, 1, :a1, 1, :a2, 1, :a3, 1, :a4, 1, :a5, 1, :a6, 1, :a7, 1 bit_fields :b, :b0, 1, :b1, 1, :b2, 2, :b3, 4 end あとは普通のRuby-FFIと全く同じです。 a = Struct1.new 読み込むときは p a[:a0] 書き込むときは a[:a0] = 1 とします。 一応テストもちょこっと書いたので、通常の用途ではほとんど問題なく使えると思います。 バグを見つけたらぜひ報告ください! しかしなにぶん苦手な分野ですので、コーナーケースでは、ひょっとするとまだまだバグが残っているかも知れません。 もしもおかしな挙動を発見した方はgithubのissue欄にぜひ報告してください。 作者としては大変助かります。 気持ちとしてはお礼の品を差し上げたいぐらいですが、そういうわけにもいかないので、そのかわりに幸せな気持ちになるハトのgif画像を貼っておきます。 この記事は以上です。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rubyで正規表現マッチ

やりたいこと ある文字列strからパターンマッチする文字列reg_expを取り出したい 結論 # ここからbcdを抽出 str = "abcdef" puts str.match(/a(bcd)ef/)[1] $ bcd ちなみに、str.match(/a(bcd)ef/)[0]にすると abcdef が出力されます。 正規表現と組み合わせると色々使えます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsセキュアパスワードの実装について

セキュアパスワードとは セキュアパスワードという手法を使う際には、 ユーザーにパスワードとパスワードの確認の入力をさせ、 そのままDB上に保存するのではなくハッシュ化したものを DBに保存する方法のことを指します。 セキュアパスワード使用されるハッシュ化の処理は、 入力されたデータをハッシュ関数を使用して 元のデータに戻すことのできない(不可逆)形にする処理を行なっています。 ユーザー認証は、「パスワードの送信」→「ハッシュ化」→「DB内のハッシュ化された値との比較」といったような手順で進んで行きます。 比較した結果が一致すれば、送信したパスワード(入力したパスワード)は正しいということになり、ユーザー認証されることになります。 仮にDBの内容が盗まれたり、覗き見られるようなことがあってもパスワードの安全性が保たれ、 生のパスワードをデータベースに保存することなく認証することができます。 セキュアパスワードの実装方法 モデルファイルにhas_secure_passwordメソッドを追加 modelにhas_secure_passwordを追加します。 models/user.rb class User < ApplicationRecord has_secure_password end モデルにhas_secure_passwordを追加することで、下記のような機能が使えるようになります。 ハッシュ化したパスワードを、データベース内の「password_digest」という属性に保存することができるようになる 2つのペアの仮想的な属性「password」、「password_confirmation」が使用できるようになり、存在性と値が一致するかどうかのバリデーションも追加される *(モデルのオブジェクトからは存在しているように見えるが、データベースには対応するカラムが存在しない、という意味です。) authenticateメソッドが使えるようになる has_secure_password機能は記述するだけで使用可能になりますが、 モデル内に「password_digest」という属性が存在している必要があります。 password_digestをテーブルに追加 コンソールから、属性名と型の情報を入力していきます。 $ rails generate migration add_password_digest_to_users password_digest:string [timestamp]_add_password_digest_to_users.rb class AddPasswordDigestToUsers < ActiveRecord::Migration[6.0] def change add_column :users, :password_digest, :string end end エラー等がなければ、マイグレーションを実行します。 $ rails db:migrate bcryptをinstall has_secure_passwordを使ってパスワードをハッシュ化するためには、最先端のハッシュ関数であるbcryptが必要になります bcryptを使うためにGemfileに追加します。 Gemfile gem 'bcrypt', '3.1.13' bundle install
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails db:migrate時のエラー「Cannot add a NOT NULL column」について

初めに 某ガイドの学習中にエラーが発生したため、その解決方法を記事にします。 初めての投稿ですので、至らぬ点などあればご指摘いただけますと幸いです。 エラーが発生した状況 UserテーブルとTaskテーブルがあります。 User : Taskの間で1 : 多の関係となるように、マイグレーションファイルを作成し、マイグレーションを行ったタイミングで下記エラーが発生しました。 発生したエラー terminal rails aborted! StandardError: An error has occurred, this and all later migrations canceled: SQLite3::SQLException: Cannot add a NOT NULL column with default value NULL: ALTER TABLE "tasks" ADD "user_id" integer NOT NULL エラー内容を見てみると「Cannot add a NOT NULL column with default value」と記載があるとおり、columnにNOT NULLを与えることができないとなっています。 エラーが発生した際のマイグレーションファイルは以下のとおりです。 xxxxxxxxxxxxxx_AddUserIdTasks.rb class AddUserIdToTasks < ActiveRecord::Migration[5.2] def up execute "DELETE FROM tasks;" add_reference :tasks, :user, null: false, index: true end end execute "DELETE FROM tasks;"はSQLによって、ここまでに作成したタスクを削除しています。 add_reference :tasks, :user, null: false, index: trueでは、tasksにuserと関連付けたuser_idカラムを追加し、制約としてnull: false, index: trueオプションをつけようとしています。 このadd_reference行についてエラーが発生しました。 解決した方法 先にも記載したとおり「Cannot add a NOT NULL column with default value」ということでしたので、null: falseを削除したら無事マイグレーションできました。 xxxxxxxxxxxxxx_AddUserIdTasks.rb class AddUserIdToTasks < ActiveRecord::Migration[5.2] def up execute "DELETE FROM tasks;" add_reference :tasks, :user, index: true end end 原因について詳しく特定できていませんが、某ガイドの指定しているデータベースとは別のデータベースを用いているのが理由なのかなと考えています。試していないので断言はできませんが。。。 なお、下記を行うことでNOT NULL制約を与えることができました。 xxxxxxxxxxxxxx_ChangeUserIdToTasks class ChangeUserIdToTasks < ActiveRecord::Migration[5.2] def change change_column :tasks, :user_id, :integer, null: false end end 参考にさせて頂いた記事 [Qiita]マイグレショーンファイルを作成する際のnull: false
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

bundle installで初期化できない

要約 Macbookから一度削除したプロジェクトをもう一度クローンした Macbookは、削除からクローンの間に、クリーンインストールしてTimeMachineBackupから復元している。 xcodeがインストールされていないことに起因するエラーであった。 プロジェクトクローン時に引っかかった % bundle installをするもエラーが大量発生 An error occurred while installing nio4r (2.5.7), and Bundler cannot continue. Make sure that `gem install nio4r -v '2.5.7' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: rails was resolved to 6.1.3.2, which depends on actioncable was resolved to 6.1.3.2, which depends on nio4r Gem::Ext::BuildError: ERROR: Failed to build gem native extension. current directory: /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/gems/bcrypt-3.1.16/ext/mri /Users/n-syuichi/.rbenv/versions/2.7.2/bin/ruby -I /Users/n-syuichi/.rbenv/versions/2.7.2/lib/ruby/2.7.0 -r ./siteconf20210725-26400-18rx3v2.rb extconf.rb creating Makefile current directory: /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/gems/bcrypt-3.1.16/ext/mri make "DESTDIR=" clean xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun current directory: /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/gems/bcrypt-3.1.16/ext/mri make "DESTDIR=" xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun make failed, exit code 1 Gem files will remain installed in /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/gems/bcrypt-3.1.16 for inspection. Results logged to /Users/n-syuichi/IdeaProjects/ReservationSample/vendor/bundle/ruby/2.7.0/extensions/x86_64-darwin-20/2.7.0/bcrypt-3.1.16/gem_make.out An error occurred while installing bcrypt (3.1.16), and Bundler cannot continue. Make sure that `gem install bcrypt -v '3.1.16' --source 'https://rubygems.org/'` succeeds before bundling. In Gemfile: devise-i18n was resolved to 1.10.0, which depends on devise was resolved to 4.8.0, which depends on bcrypt 解決策(結論) % xcode-select --install を実行し、Xcode Commandlinetoolをインストール 原因 MacBookのSSD換装を行い、OS新規インストール後TimeMachineから復元したため、Xcode等がインストールされていなかった。 チェックしたこと bundlerのパス(vendor/bundleにインストールされているか) rubyのバージョン(rbenv等) エラーメッセージのコマンド実行(Gemコマンドからのインストール)ができるかどうか bundlerがインストールされているかどうか 参照先
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsプロジェクトのデータベースの構造のER図をPlantUMLで自動的に吐き出せるようにしてみた

モチベーション QiitaでもPlantUMLを表示できるようになってきたので、いよいよPlantUMLが民主化されてきました。 そこで「データベースの情報を基に自動的にER図作ってくれたらいいのになぁ...」と思ったので勢いで作ってみました。 対象となる技術の選定と制限 ER図の特徴の都合上、各種リレーションの定義を取得するためにはORMが使用されているものを対象に作成する必要があります。 今回は以下が使用されている環境を想定してスクリプトを作成・実行しました MySQL Rails これは実行テストを行った対象である 「ハッカソンの開催情報を自動でお知らせするBot HackathonPortal 」 の実行環境に合わせたためです。 同じ Rails でも Postgresql や SQLite においては実行確認していないのでうまくいくかわかりません。(試してみてうまくいったご報告をいただけましたら幸いです。その時は更新いたします) 実際に作成したソースコード 以下が実際に作成したコードになります task export_entity_relationship_diagram_plantuml: :environment do # 使用されている全てのテーブルのModelの情報を取得するために全て読み込む Rails.application.eager_load! # 使用されている全てのテーブルを持っていて関係性がわかるModelの情報を取得する model_classes = ActiveRecord::Base.descendants.select{|m| m.table_name.present? } class_name_model_class_pair = model_classes.index_by(&:to_s) relation_entity_components = Set.new entity_component_fields = Set.new foreign_key_pairs = {} # ER図においてそれぞれのエンティティとの関連性を記述していく class_name_model_class_pair.values.each do |model_class| model_class.reflections.values.each do |relation_info| # polymorphic の belongs_to の構造はリレーション関係がわからないのでスルー next if relation_info.polymorphic? # belongs_to 参照元を取得する場合はfrom と toの対象を交換する if relation_info.instance_of?(ActiveRecord::Reflection::BelongsToReflection) to_model_class = model_class from_model_class = class_name_model_class_pair[relation_info.class_name] else from_model_class = model_class to_model_class = class_name_model_class_pair[relation_info.class_name] end primary_keys = [from_model_class.primary_key].flatten to_foreign_key_string = [to_model_class.table_name, relation_info.foreign_key].join(".") if relation_info.options[:primary_key].present? from_foreign_key_string = [from_model_class.table_name, relation_info.options[:primary_key]].join(".") else from_foreign_key_string = primary_keys.map{ |primary_key| [from_model_class.table_name, primary_key].join(".") }.join(",") end # 外部キーのカラムとの関係性を記録する foreign_key_pairs[to_foreign_key_string] = from_foreign_key_string # has_many 関係性を表現 1対多の場合 if relation_info.instance_of?(ActiveRecord::Reflection::HasManyReflection) # 0 ~ 複数 relation_entity_components << [from_model_class.table_name, "--o{", to_model_class.table_name].join(" ") # has_one 関係性を表現 1対1の場合 elsif relation_info.instance_of?(ActiveRecord::Reflection::HasOneReflection) # belongs_toの要素が先に登録されていたら消す relation_entity_components.delete([from_model_class.table_name, "--o{", to_model_class.table_name].join(" ")) # 0 ~ 1 relation_entity_components << [from_model_class.table_name, "|o--o|", to_model_class.table_name].join(" ") # has_many :through 関係性を表現 多対多の場合 elsif relation_info.instance_of?(ActiveRecord::Reflection::ThroughReflection) relation_entity_components << [from_model_class.table_name, "}o--o{", to_model_class.table_name].join(" ") # belongs_to 参照元を取得 とりあえず 1対多として記録 elsif relation_info.instance_of?(ActiveRecord::Reflection::BelongsToReflection) # has_one の要素が記録されていたらスキップ unless relation_entity_components.include?([from_model_class.table_name, "|o--o|", to_model_class.table_name].join(" ")) relation_entity_components << [from_model_class.table_name, "--o{", to_model_class.table_name].join(" ") end end end end # ER図においてそれぞれのエンティティのカラムの特徴を記述していく class_name_model_class_pair.values.each do |model_class| primary_keys = [model_class.primary_key].flatten entity_components = [] entity_components << ['entity', '"' + model_class.table_name + '"', '{'].join(" ") model_class.columns.each do |model_column| table_column_string = [model_class.table_name , model_column.name].join(".") if primary_keys.include?(model_column.name) entity_components << ["+", model_column.name, "[PK]", model_column.sql_type].join(" ") entity_components << "==" # 外部キーには目印 elsif foreign_key_pairs[table_column_string].present? entity_components << ["#", model_column.name, "[FK(" + foreign_key_pairs[table_column_string] + ")]", model_column.sql_type].join(" ") else entity_components << [model_column.name, model_column.sql_type].join(" ") end end entity_components << '}' entity_components << "\n" entity_component_fields << entity_components.join("\n") end # PlantUMLを記述 plntuml_components = Set.new plntuml_components << "```plantuml" plntuml_components << "@startuml" plntuml_components += entity_component_fields plntuml_components += relation_entity_components plntuml_components << "@enduml" plntuml_components << "```" export_plantuml_path = Rails.root.join("er-diagram.plantuml") File.write(export_plantuml_path, plntuml_components.to_a.join("\n")) end 上記のソースコードを rails runner または rake task名, rails task名 にて実行することで、プロジェクト内のER図を表したPlantUMLファイルが出力されます 実行テスト 上記のスクリプトを実行して のプロジェクトのER図を出力してみた内容が以下の通りになります ER図を輩出してみたことで、使用していないテーブルやポリモーフィックの多様などデータ構造におけるアンチパターンを多用していることが判明したので、本プロジェクトについては後日テーブル構造を見直そうと思います... また HackathonPortal のプロジェクトやソースコードはこちらにて公開していますので興味がある方はこちらも参照してください。 処理の中身の解説などはこちらを参照してください 最新のハッカソンの開催情報を自動で集めて、お知らせするBotを作ったので頭の中を紹介 まだフォローしていない方はフォローのほどよろしくお願いします。 @HackathonPortal これから 希望が多くありましたら、汎用的に使用できるように gem化 しようと思います。 また勢いで作ったので汎用化にあたり漏れているユースケースがあるかもしれません。 その場合は都度更新していきたいと思います。 参考 PlantUMLでER図を書いて、githubで管理してみた やさしい図解で学ぶ ER図 表記法一覧
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】コメント削除機能の実装(備忘録)

はじめに アプリ開発中に、コメント削除すると古い順から削除されてしまう状況から、更にエラーになり詰まってしまったので、教えて頂いたことも含め備忘録としてまとめます。 開発環境 Mac Ruby 2.7.2 Rails 6.1.3.2 前提条件 コメント投稿機能は実装済み Articleモデル(投稿) Commentモデル(コメント) 現状 コメント削除をすると、古い順から削除される現状。 該当コード config/routes.rb resources :articles do resource :comments, only: %i[create destroy] end app/controllers/articles_controller.rb def show @comment = Comment.new @comments = Comment.includes(:user, :article).order(created_at: :desc) end app/controllers/comments_controller.rb class CommentsController < ApplicationController def create article = Article.find(params[:article_id]) @comment = current_user.comments.build(comment_params) @comment.article_id = article.id if @comment.save flash[:notice] = 'コメントしました' redirect_back(fallback_location: root_path) else flash[:alert] = 'コメントできませんでした' redirect_back(fallback_location: root_path) end end def destroy current_user.comments.find_by(article_id: params[:article_id]).destroy! flash[:alert] = '削除しました' redirect_back(fallback_location: root_path) end private def comment_params params.require(:comment).permit(:content).merge(user_id: current_user.id, article_id: params[:article_id]) end app/views/articles/show.html.erb <div> <h2>コメント</h2> <%= render "comments/form" %> <%= render "comments/comment" %> </div> app/views/comments/_comment.html.erb <% @comments.each do |comment| %> <hr> <p><%=link_to "#{comment.user.name}", user_path(comment.user.id) %></p> <p><%= comment.content %></p> <p><%= link_to "削除", article_comments_path(@article, comment), method: :delete, data: { confirm: "削除しますか?" } %></p> <% end %> app/views/comments/_form.html.erb <%= form_with(model: [@article, @comment], local: true) do |form| %> <%= form.text_area :content %> <%= button_tag type: "submit", class: "btn btn-success float-right mt-1" do %> <i class="far fa-comments"></i> コメントする <% end %> <% end %> 原因 app/controllers/comments_controller.rbのfind_byメソッドが原因で、古い順から削除されていました。 app/controllers/comments_controller.rb def destroy current_user.comments.⭐find_by(article_id: params[:article_id]).destroy! flash[:alert] = '削除しました' redirect_back(fallback_location: root_path) end find_byメソッドとは? 各モデルをid以外の条件で検索するメソッド(idでも検索可能。複数の検索条件を指定可能)。返ってくる結果は、最初にヒットした1件のみ!(ココ大事。) id及びid以外の条件が分かっている場合、その条件に該当する最初のデータを取得したい場合に使用。該当データがない場合は、nil が返る。 最初にヒットした1件のみなので、指定したコメントを削除できない状況になっていました。 解決法 find_by ではなく、 find へ変更。 app/controllers/comments_controller.rb def destroy current_user.comments.⭐find(article_id: params[:article_id]).destroy! flash[:alert] = '削除しました' redirect_back(fallback_location: root_path) end 解決〜!と思っていたら、下記のエラー発生。「コメントのidがみつかりません」と表示されています。binding.pry 使用して、確認すると、comment_idがnill となっていました。 Couldn't find Comment with 'id'={:article_id=>"5"} [WHERE "comments"."user_id" = $1] なぜ?nil になるのか? 基本的に findメソッド は、プライマリーキー項目しか引数に取れない。(正確に言うと、引数に取れるが find で取得する対象は自動的に id という項目のみ。) comment_id というカラムは存在しないため、nil になる。 上記のアドバイスを頂いて、なるほど~!となりました。 (article_id: params[:article_id]) を下記の⭐へ変更 app/controllers/comments_controller.rb def destroy current_user.comments.find(⭐params[:id]).destroy! flash[:alert] = '削除しました' redirect_back(fallback_location: root_path) end 今度は、idがnil とのエラーになりました。 ActiveRecord::RecordNotFound (Couldn't find Comment with 'id'={:id=>nil} [WHERE "comments"."user_id" = $1]): View側に、idを設定していないので、「idがありませんよ」と怒られていると仮定して、下記へ変更。 app/views/comments/_comment.html.erb <p><%= link_to "削除", article_comment_path(⭐comment.article.id, comment.id), method: :delete, data: { confirm: "削除しますか?" } %></p> 次こそ上手くいく!と思っていましたが、下記エラー。「ルートが一致しません。」と怒られます。ルートの記述が間違っていると仮定。 ActionController::RoutingError (No route matches [DELETE] "/articles/5/comments.206"): resource から resources へ変更。 routes.rb ⭐resources :comments, only: %i[create destroy] resourceメソッド には、idが付与されないため、リソースを絞り込めない(絞り込まない)状況で使用するもの。 かなりの凡ミスです 複数存在するリソース(商品やユーザーなど)では resources を使用しましょう。 これで、無事に指定したコメントの削除が可能になりました! まとめ 基本的なメソッドの理解がなく、ハマってしまったエラーでした。今回のエラーで、基本的なメソッドを復習できて大変勉強になりました。同じようなエラーにハマっている方へ、参考になると幸いです 参考記事 [Rails]コメント削除機能の実装でハマってしまったので一応解決策を。 指定先のコメント削除ができない Railsガイド
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

utf8とutf8mb4の違い

utf8 ・簡単に言うと絵文字が使えない ・Unicodeに対応している ①アルファベット、数字、記号などの基本的な文字を表すASCIIコード ②世界中のあらゆる文字(例えばハングル文字やアラビア文字など)を加えた文字の集合体 →これらのことを指す ・世界中に普及している utf8mb4 ・絵文字が使える ・MySQLで扱うための文字コード アプリ作成時に以下のコマンドを入力すると % rails new アプリ名 -d mysql 以下のように、デフォルトでdatabase.ymlに「utf8mb4」が記載されている。 例)database.yml default: &default adapter: mysql2 encoding: utf8mb4 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: socket: /tmp/mysql.sock utf8を使いたかったら上から三段目を変えれば良い。 default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: socket: /tmp/mysql.sock 以上です。 おまけ 僕のTwitter:https://twitter.com/honaki_days?s=21
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【第8章】Railsチュートリアルでハッシュとシンボルについて忘れていたので復習した

Railsチュートリアル第8章(第6版)でハッシュとシンボルを忘れていたので、復習した。 ①ハッシュとは ・基本的には配列と同じだが、インデックスとして整数値以外のものを使える。 ・キーと値のペアを波カッコで囲んで表記する。 ・ハッシュでは要素の並び順が保障されない。 ・JavaでいうMapだと思っている。 >> user = {} # {}は空のハッシュ => {} >> user["first_name"] = "Pai" # キーが "first_name" で値が "Pai" => "Pai" >> user["last_name"] = "Abble" # キーが "last_name" で値が "Abble" => "Abble" >> user["first_name"] # 要素へのアクセスは配列の場合と似ている => "Pai" ②省略1 ハッシュの1要素を角カッコを使って定義する代わりに、=>(ハッシュロケット)を使ってリテラル表記する方が簡単。 >> user = { "first_name" => "Pai", "last_name" => "Abble" } => {"last_name"=>"Abble", "first_name"=>"Pai"} ③省略2 -シンボル- ・Railsではハッシュのキーとして、文字列よりもシンボルを使うのが普通。 ・シンボルはクォートで囲む代わりにコロンを前に置く。 ・文字列と違って全ての文字が使えるわけではない。(一般的なアルファベットを使うかぎりは問題ないらしい) ・Ruby以外ではごく一部の言語にしか採用されていない特殊なデータ形式。 >> "name" #文字列 => "name" >> :name #シンボル => :name >> :foo-bar              #使えない文字 NameError: undefined local variable or method `bar' for main:Object >> :2foo #使えない文字 SyntaxError ハッシュのキーにシンボルを採用する場合のuser >> user = { :first_name => "Pai", :last_name => "Abble" } => {:last_name =>"Abble", :first_name =>"Pai"} ④省略3 ハッシュではシンボルをキーとして扱うことが一般的なので、Ruby1.9からは新しい記法がサポートされた。 ・シンボルとハッシュロケットの組み合わせを、キーの名前の前ではなく後にコロンを置き、その後に値が続くように置き換えることが出来る。 >> user = { first_name: "Pai", last_name: "Abble" } => {:last_name =>"Abble", :first_name =>"Pai"} ⑤まとめ ①~④で忘れていた箇所を思い出せた。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails 6】 テーブルへCSVファイルをインポートした際にNameErrorが出力された時の対処法

はじめに CSVファイルをテーブルにインポートした際に、NameErrorが出力されて躓いたので、備忘録として残します。 開発環境 Mac Ruby 2.7.2 Rails 6.1.3.1 PostgreSQL 13.2 前提 rails db:seedコマンドを実行後、以下のseeds.rbからimport_csv.rbを呼び出して、テーブルにcsvファイルをインポートします。 db/seeds.rb ImportCsv.information_data lib/autoloads/import_csv.rb class ImportCsv # CSVデータのパスを引数として受け取り、インポート処理を実行 def self.import(path) list = [] CSV.foreach(path, headers: true) do |row| list << row.to_h end list end def self.information_data list = import('db/csv_data/information.csv') puts "インポート処理を開始" Information.create!(list) puts "インポート完了!" end end エラーメッセージ 前提で記載した通り、rails db:seedを実行した結果、以下のエラーメッセージが出力されました。 % rails db:seed rails aborted! NameError: uninitialized constant ImportCsv NameErrorのメッセージ内容を調べてみましたところ、以下の記事によると、NameErrorは定義されていない変数またはメソッドを使用したときに発生するとのことです。 seeds.rbからimport_csv.rbを上手く呼び出せていないのでは?と思いました。 対応方法 以下のようにapplication.rb(すべての環境で共通の設定ファイル)のconfig.autoload_paths(オートロード対象)にlib/autoloadsを指定することで、import_csv.rbを呼び出すようにしました。 config/application.rb module モジュール名 class Application < Rails::Application # lib/autoloads ディレクトリ配下のファイルを読み込む config.autoload_paths << Rails.root.join('lib/autoloads') end end 上記の設定後にrails db:seedを実行してみた結果、テーブルにCSVファイルを上手くインポートすることができました。 % rails db:seed インポート処理を開始 インポート完了! % 参考記事 エラーメッセージから学ぶ Railsドキュメント_設定ファイルについて Railsドキュメント_オートロード対象となるパスの追加
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[RSpec]system specでコントローラーのテスト(FactoryBot使用)

今回はRSpecの中トロ部分、system specでコントローラーのテストを実行していきます。 コントローラーのテストでは、実際に操作するような感覚でテストコードを書いていきます。 開発環境 ruby 2.6.3 Rails 5.2.6 前提 FactoryBot使用 Faker使用 capybara使用 devise使用 RSpecの準備、FactoryBotでのテストデータの定義等は、下記記事にまとめてますので、まだの方は先にこちらをどうぞ。 [Rails]RSpecでテストを行う準備(FactoryBot使用) ファイルの作成 まずは、spec配下にsystemフォルダを作って、その中に各コントローラーのファイルを作っていきます。 今回は、 posts_spec.rb を例にコードを記述していきます。 作成した各モデルのファイルで、rails_helperの設定を読み込んでいきます。 rails_helperはRSpecの設定が記述してあるファイルです。 コードを1行書くだけで、読み込めるので先に記述しておきます。 最初にまとめて書いておくことで、書き忘れを防げます! コントローラーファイル require 'rails_helper' deviseのヘルパーを使えるようにする controllerのテストを実行していく中で、sign_inなどのdeviseのヘルパーを使う機会が出てきます。 なぜRSpecのコードを書いていくときに、deviseのヘルパーが必要かというと、アクセス権限でログインしてないユーザーを許可していない場合があるからです。 ユーザーの編集ページはログインしてないときは、アクセスできないなど spec/rails_helper.rbにdeviseのヘルパーを使えるようにコードを追加します。 spec/rails_helper.rb : # deviseのヘルパーメソッドをsystemで使用できるように設定 config.include Devise::Test::IntegrationHelpers, type: :system end これでdeviseのヘルパーをsystemで使用できるようになりました。 capybaraの設定 systemでCapybaraを使ってテストできるように、spec_helperに設定を追加します。 spec/spec_helper.rb : RSpec.configure do |config| # 以下3行を追加 config.before(:each, type: :system) do driven_by :rack_test end : これでsystemでcapybaraが使えるようになりました。 テストコードを書いていく posts_specでは投稿のテストと削除のテストを行います。 テスト項目の洗い出し まずはテスト項目の洗い出しを行っていきます。 投稿のテストでは、成功したときと失敗したときのテストを書いていきます。 spec/system/posts_spec.rb require 'rails_helper' describe '投稿に関するテスト' do describe "投稿のテスト" do context "投稿が成功したとき" do it "投稿成功後の遷移先が正しいか" do # この中にテストの処理を書いていく end it "投稿成功後の表示の確認" do # この中にテストの処理を書いていく end end context "投稿が失敗したとき" do it "投稿失敗後の遷移先が正しいか" do # この中にテストの処理を書いていく end it "投稿失敗後の表示の確認" do # この中にテストの処理を書いていく end end end describe "削除のテスト" do it "削除リンクが表示されているか" do # この中にテストの処理を書いていく end it "削除されるか" do # この中にテストの処理を書いていく end end end RSpecの記述の基本形がわからない方はこちらの記事参照 最低限覚えておきたいRSpecの基本構成 テストデータをつくる FactoryBotで作っておいたデータをつ使います。 わからない方は、こちらの記事で確認してください。 [Rails]RSpecでテストを行う準備(FactoryBot使用) spec/system/posts_spec.rb : describe '投稿に関するテスト' do # FactoryBotのテストデータを使う let!(:user) { create(:user) } let!(:post) { create(:post, user_id: user.id) } describe "投稿のテスト" do : beforeを記述 投稿のテストも削除のテストもサインインしてから使う機能なので、サインインしてからテストを実行したいので、beforeでサインインしたあとに各ページに移動しておきます。 spec/system/posts_spec.rb : describe "投稿のテスト" do # userでログインしてから新規投稿画面へ遷移 before do sign_in user visit new_post_path end : describe "削除のテスト" do # userでログインしてから投稿一覧へ遷移 before do sign_in user visit posts_path end : テストの中身を記述 これで、準備ができたので、itの中でテストを実行していきます。 コード内に解説を入れています。 spec/system/posts_spec.rb require 'rails_helper' describe '投稿に関するテスト' do # FactoryBotのテストデータを使う let!(:user) { create(:user) } let!(:post) { create(:post, user_id: user.id) } describe "投稿のテスト" do before do sign_in user visit new_post_path end context "投稿が成功したとき" do it "投稿成功後の遷移先が正しいか" do # contentのフォームにFakerでランダムな5文字の文字列を入れる fill_in 'post[content]', with: Faker::Lorem.characters(number: 5) # 投稿ボタンをクリック click_button "投稿" # 投稿成功後の遷移先が期待したパスになっているか expect(page).to have_current_path posts_path end it "投稿成功後の表示の確認" do # contentのフォームにFakerでランダムな5文字の文字列を入れる fill_in 'post[content]', with: Faker::Lorem.characters(number: 5) # 投稿ボタンをクリック click_button "投稿" # 投稿が成功して"投稿が成功しました"の文字があるか expect(page).to have_content "投稿に成功しました" end end context "投稿が失敗したとき" do it "投稿失敗後の遷移先が正しいか" do # contentのフォームを空にする fill_in 'post[content]', with: nil # 投稿ボタンをクリック click_button "投稿" # エラーが起きて選先が期待したパスになっているか expect(page).to have_current_path posts_path end it "投稿失敗後の表示の確認" do # contentのフォームを空にする fill_in 'post[content]', with: nil # 投稿ボタンをクリック click_button "投稿" # エラーが出てエラーメッセージが表示されているか expect(page).to have_content "入力してください" end end end describe "削除のテスト" do before do sign_in user visit posts_path end it "削除リンクが表示されているか" do # 削除のパスへのリンクがあるか expect(page).to have_link "", href: post_path(post) end it "削除されるか" do # 削除された時データベースから削除されているか expect { post.destroy }.to change(Post, :count).by(-1) end end end マッチャーについてわからない方はこちらの記事参照 [Rails]RSpecでよく使うマッチャー10選 まとめ system specでコントローラーのテストを実施する手順は4つです。 system specファイルの作成 deviseのヘルパーを使えるようにする capybaraの設定 テストコードを書いていく 今回はかんたんな投稿と削除機能のみでしたが、今後も色んなテストコードを投稿していきたいと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

特定の期間の投稿数表示:今日の投稿数、今週の投稿数 scope

やりたいこと 今日の投稿数、昨日の投稿数、前日比% 今週の投稿数、先週の投稿数、先週比を表示させたい。 モデルファイルの記述 book.rb scope :created_today, -> { where(created_at: Time.zone.now.all_day) } scope :created_yesterday, -> { where(created_at: 1.day.ago.all_day) } scope :created_this_week, -> { where(created_at: 6.day.ago.beginning_of_day..Time.zone.now.end_of_day) } scope :created_last_week, -> { where(created_at: 2.week.ago.beginning_of_day..1.week.ago.end_of_day) } モデルファイルにスコープで記述します。こうやってモデルファイルで定義しておけば、 コントローラーもスッキリするのはわかります。 Scopeって何・・・・? モデル側であらかじめ特定の条件式に対して名前をつけて定義し、 その名前でメソッドの様に条件式を呼び出すことが出来る仕組みのこと だそう。 コントローラーの記述 users_controller.rb @books = @user.books.page(params[:page]).reverse_order @today_book = @books.created_today @yesterday_book = @books.created_yesterday @this_week_book = @books.created_this_week @last_week_book = @books.created_last_week bookモデルに記述した定義も、usersコントローラーで使用可能! View <table class="table"> <thead> <tr> <th>今日の投稿</th> <th>昨日の投稿</th> <th>前日比</th> </tr> </thead> <tbody> <tr> <td><%= @today_book.count %></td> <td><%= @yesterday_book.count %></td> <% if @yesterday_book.count == 0 %> <td>前日の投稿はなし</td> <% else %>  <td><% @the_day_before = @today_book.count / @yesterday_book.count.to_f %>  <%= (@the_day_before * 100).round %>%</td> <% end %> </tr> </tbody> </table> <table class="table"> <thead> <tr> <th>今週の投稿</th> <th>先週の投稿</th> <th>比</th> </tr> </thead> <tbody> <tr> <td><%= @this_week_book.count %></td> <td><%= @last_week_book.count %></td> <% if @last_week_book.count == 0 %> <td>先週の投稿はなし</td> <% else %>  <td><% @the_week_before = @this_week_book.count / @last_week_book.count.to_f %>  <%= (@the_week_before * 100).round %>%</td> <% end %> </tr> </tbody> </table> 難しかったのは、前日比、先週比の出し方です。 <td><% @the_week_before = @this_week_book.count / @last_week_book.count.to_f %>  <%= (@the_week_before * 100).round %>%</td> まず、to_fは少数点までの数値まで表示してくれるそうです。 それに100をかけて%で表示されます。 終わりに scope使いこなせるようになりたい!!!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

サイト言語変換の表示

▪️ 今回はサイトに言語表記の変換機能を表示する方法を紹介 例 ] 日本の遺産を紹介している日本遺産ポータルのサイトを見ていただければわかりやすいと思います。右端の方に言語を日本語から英語、英語から日本語に変換できる場所が存在します。 ▪️ 言語変換機能の表示 JPと書かれているコードは日本語表記を表しています。 ↓ 英語表記の場合はどうしたら良いのか? 上記の例で挙げた日本遺産ポータルサイトでは英語表記に変える際、英語版のサイトと日本語版のサイトを紐付けしていました。 気になる方は日本遺産ポータルサイトで検証を行って見てください。 今日の投稿は以上です。 wagaでした!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails, AWS, Dockerでポートフォリオ作成

リンク 【ポートフォリオ】 https://tasty-life.site/ 【Github】 https://github.com/YukiIshizaki0525/TastyLife はじめに 独学でサーバーサイド、フロントエンド、インフラを1から勉強し、Webアプリを作成しました。 本記事で、作成で苦労した点、各種機能、機能実装で参考になったサイトなどを記載いたしますので、現在ポートフォリオ作成中の未経験エンジニアやこれからポートフォリオを作ろうと考えている方のヒントとなれば幸いです。 機能実装方法やテストの書き方などより詳細な内容については別途Qiitaを投稿する予定ですので、更新をお待ちいただければと思います。 本記事についてのご質問や気になった点などがあればできる限り回答いたしますのでTwitterのDMやコメントでお知らせください。 【Twitterアカウント】 https://twitter.com/Luke19770525 概要 一人暮らしの自炊継続のモチベーションアップ及び脱マンネリ化したいという思いから制作 制作背景 私自身一人暮らしで、日々自炊を行っていて、以下のことが課題と感じています。 作る料理がマンネリ化してしまい、モチベーションが下がり、自炊を突然やめてしまう 一人暮らしの自炊についての相談できる機会がない 冷蔵庫に保管している食材を管理できていないため、腐らせてしまったり余っているのに買ってしまう そこで、上記課題を解決できる 一人暮らしの方の自炊を応援するアプリケーション を作成しようと決意しました。 今後の展望 自炊を行う知り合いに使ってもらっていて、ユーザーの貴重な意見を参考に日々改善を行っています。 今後、追加予定の機能及び変更点を5点ほど列挙します。 - アプリケーション自体をVue.jsでSPA化 - APIの導入 - 現在の食材管理状況を毎日18:00にメールで登録済みメールアドレスに配信 - 材料や作り方をドラッグ&ドロップして入れ替えられる仕様 - 作り方の画像プレビュー機能の追加 工夫した点 UI/UX - レシピを見て料理をする際はスマートフォンで見ることも多いのでレスポンシブデザインにしたこと - ページタイトル、文字色、ボーダー等の色を統一したこと - 一覧ページへ移動、削除、送信などをアイコンにして、直感的に操作できるようにしたこと - ホバーアクションやクリックアクションなどCSSアニメーションを取り入れ、動きのあるサイト構成にしたこと - 使いやすい導線設計 機能面 - 一人暮らしでの自炊での悩み(マンネリ化・食材管理など)を解決できるような機能を作成して、一般的なレシピサイトとの差別化を図ったこと - 作りたい料理が決まらない日が多いため、タグ検索機能を追加し、作りたい料理を決められる手助けとなるようにしたこと - 自炊を続けている方の相談や関心が高い相談を見て、自身の生活にも取り入れられるよう、相談のソート機能を追加したこと - 保存中の食材を把握しきれず無駄な買い足しや食材廃棄してしまっていたため、無駄な買い足しや食材廃棄を未然に防ぎ、余り物を有効活用できるよう、保存中の食材管理機能を追加したこと テスト - バリデーションやデザインに不備なく、ユーザーが安心してご利用いただけるようモデルスペック及びシステムスペックを十分に実施 ModelSpec結果 SystemSpec結果 学習で参考になったサイトや教材 ◎は非常に参考になった教材です。(個人の感想です) フロントエンド HTML/CSS/JavaScript ◎【JavaScript&CSS】ガチで学びたい人のためのWEB開発徹底実践(フロントエンド編) 【JS】ガチで学びたい人のためのJavaScriptメカニズム サーバーサイド Ruby ◎プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで Rails ◎Ruby on Rails チュートリアル ◎現場で使える Ruby on Rails 5速習実践ガイド ◎フルスタックエンジニアが教える 即戦力Railsエンジニア養成講座 パーフェクト Ruby on Rails テスト基盤 RSpec ◎Everyday Rails - RSpecによるRailsテスト入門 ◎【Rails】はじめてのRSpec!テストコードを書こう! データベース ◎BigQuery で学ぶ非エンジニアのための SQL データ分析入門 ◎はじめてのSQL ・データ分析入門 -データベースのデータをビジネスパーソンが現場で活用するためのSQL初心者向コース インフラ Docker ◎Docker超入門講座 合併版 | ゼロから実践する4時間のフルコース ◎ゼロからはじめる Dockerによるアプリケーション実行環境構築 【Rails AWS Docker】既存Ruby on Rails + MySQLアプリをDockerで構築し、AWSにデプロイする(1) AWS ◎AWS:ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得 ◎サルでもできる!? Rails6 のアプリをAWS EC2にデプロイするまでの全手順【前半】(VPC, RDS, EC2, Capistrano) 苦労した点 フロントエンド レスポンシブデザインのため、scssファイルを多く管理するのが大変でした。 JavaScriptでイベント発火時にエラーは出ないが挙動がおかしい場面が多く修復するのに苦労し、1日悩んでわからないことも多く断念したものもあります。今後はVue.jsをガッツリ勉強して対応できるようにしたい サーバーサイド 【レシピの材料及び作り方の非同期追加及び削除】の機能実装は苦労しました。Cocoon(Gem)を入れて当初実装していましたが、デザインが当たらなかったりなど、ブラックボックスに感じたので模索しながらGemを使わずに実装しました。こちらのサイトが唯一あって助かりました。 create a nested form in rails from scratch devise及びgmail認証 deviseもブラックボックスでカスタマイズするのに苦労しました。特にメール認証ではgmailにメールが届かないことが多く挫折しかけました。メール文章もデフォルトのものがあたってしまい、メール文章をカスタマイズするのにも一苦労しました。Qiitaの記事などを参考になんとか自身がイメージする形に仕上がったので良かったです。その関連でActionMailerについての知見も増え、gmailを使った退会処理機能などを実装することができました。 インフラ AWSとDockerの連携 ポートフォリオ作成初期にAWSとDockerを構築してから自動デプロイできるように努力しましたが、当初は敷居が高いと感じ、挫折しました。付け焼き刃では通用しないと思い、サイトや書籍を参考にチャレンジしたら、スムーズに構築することができました。何事も基礎がないとダメってことですね。 使用画面 トップページ ログインページ レシピ一覧(材料・レシピ名での検査、タグでのソートが可能です) レシピ詳細とコメント 相談一覧(回答数・気になる数などでソートが可能です) 相談詳細とコメント ユーザー詳細 食材管理ページ(自身のものしか見れません) 使用技術 フロントエンド HTML/CSS/Sass JavaScript(ES6) バックエンド Ruby 2.6.5 Rails 6.0.3 テスト基盤 RSpec 3.9 FactoryBot 4.10.0 データベース MySQL 5.7 インフラ Docker 20.10.7 Docker Compose 1.29.2 AWS(VPC, EC2, IAM, RDS, InternetGataway, SecurityGroup, Subnet, Route53, ALB, ACM, S3, CloudFront) Nginx 1.15.8 AWS構成図 ER図 機能一覧 基本機能 ユーザー新規登録(Gmail認証) ログイン・ゲストユーザーログイン ログアウト ログインセッション保持 ログインパスワード再設定(Gmail認証) アカウント認証メール再送 アカウントの凍結解除メール送信 ユーザー退会(論理削除) 退会済みユーザーアカウント復旧機能(Gmail認証) ユーザーアカウント情報変更(メールアドレス・プロフィール画像・ユーザー名・パスワード) メールアドレス変更(Gmail認証) フォロー中ユーザー一覧及びフォロワー一覧閲覧 ユーザーフォロー ユーザー詳細及びマイページ表示(レシピ・いいねしたレシピ・相談・気になっている相談・食材管理) ユーザー一覧 レシピに関する機能 ログイン済み レシピ投稿 材料及び作り方の非同期追加及び削除 レシピの画像添付(画像プレビュー可能) 作り方に画像添付 関連タグ付け(既定6つのタグ複数選択可能) レシピ一覧 レシピ詳細 レシピ編集(投稿したユーザーのみ) レシピ削除(投稿したユーザーのみ) コメント閲覧 コメント投稿 コメントに対する返信 コメント削除(投稿したユーザーのみ) レシピにいいねをつける レシピいいね数確認 ワードで検索(レシピ名及び材料名) 関連タグで検索 タイムライン(自身及びフォローしている方の投稿のみ表示) 未ログイン レシピ一覧 レシピ詳細 コメント閲覧 ワードで検索(レシピ名及び材料名) 関連タグで検索 相談に関する機能 ログイン済み 相談投稿 相談一覧 相談詳細 相談編集(投稿したユーザーのみ) 相談削除(投稿したユーザーのみ) 相談ソート(投稿が新しい順・投稿が古い順・気になるが多い順・回答数が多い順) コメント閲覧 コメント投稿 コメントに対する返信 コメント削除(投稿したユーザーのみ) 相談に気になる追加 相談気になる数確認 未ログイン 相談一覧 相談詳細 コメント閲覧 相談ソート 食材管理に関する機能 ログイン済みかつ自身のみ 保管中の食材追加・登録・編集・削除 食材画像,数量,個数,賞味期限,メモの登録 賞味期限までの日数確認 最後に ポートフォリオ作成は転職活動のために作成するのではなく、自身やユーザーの課題解決のために、ポートフォリオ制作を行うことに注力したので、非常に達成感があります。 ポートフォリオを使っていただいた方からありがたいことに改善点をいただいているので、作成途中よりも作成後の方がIssueが多いです(笑) ですが、実際にユーザーの生の声を聞いて、ユーザーのことをより考えながら改善や機能実装をしようと開発を進めているため、以前よりも幸せに感じながら実装ができています。 転職後も新しい技術に触れることが多いと思うので、インプットした後に本ポートフォリオに取り入れて、アウトプットの場にも使いたいと思います。 ここまでご覧いただきましたありがとうございました!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

private と protected [Ruby on Rails]

"private"と"protected" について 使用例 applicationcontrolle.rb def update @user.update(user_params) redirect_to users_path(@user) end private def user_params params.require(:user).permit(:name, :introduction, :profile_image) end userscontroller.rb protected def after_sign_in_path_for(resource) user_path(current_user) end 説明  いずれも、データベースにあるデータを書き換えるときに必要な記述になります。 Rubyは安全性を考慮し、外部からデータを変えられないようになっています。いずれかの記述をすることで、データの変更が可能になります。 「private」と「protected」の違い ・「private」は、自分だけが変更できる。 ・「protected」は、自分と仲間(同じクラスのインスタンスに加え子孫クラスのインスタンス)が変更できる。 データを守る強度が、「private > protected」になります。 基本はprivateを使っておけば問題ありません。 今回出てきた単語について ・???_params ・after_sign_in_path_for(resource)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Windows上でRubyを使えるようにする

はじめに Ruby製OSS(Redmineのプラグイン)を修正する機会があったがうまく動かなかった。 そのため、ローカルにRubyの開発環境を用意して調査することにした。 本記事は、Windows上にRubyを実行できる環境を用意した際の作業ログです。 IDE(エディタ)の選定 ググったところ、いくつかのIDEが見つかった1 2。 JetBrainsのツールであるRubyMineが気になったが、有償だったのでとりあえずはVSCodeで済ませることにした。 環境情報 Windows 10 Ruby 2.4.10-12.6.8-1 Visual Studio Code 1.58.2 Ruby (VSCodeのプラグイン) v0.28.1 作業ログ Rubyのインストール 以下から、RubyInstallerをダウンロードする。 Redmineのバージョン3に合わせて2.4を使用する。 2.4はサポートが終了している4が、ダウンロード元のアーカイブのページからダウンロードできる。 ダウンロードしたインストーラーを実行する。 全てデフォルトの設定でインストールを進めた。 インストール後、コマンドプロンプトが立ち上がり、MSYS2のインストールが始まった。 MYSY2 CygwingのようなWindowsでBash等を実行したりできるターミナルツール5 MINGW Windowsでgccを利用するためのツール6 両者ともインストールすることが推奨されているようなので7、3を指定する。 C:\Windows\system32>ruby -v ruby 2.4.10p364 (2020-03-31 revision 67879) [x64-mingw32] Rubyのインストールはできた! VSCodeプラグインのインストール VSCodeはインストール済。 VSCodeのExtemsionsから、rubyのキーワードで検索。 一番上のスターが付いているRubyという名前のプラグインが評価も高く、ぱっと見一番ダウンロード数が多いので使ってみる。 上図だと、最新バージョンのv0.28.1ではCIとビルドが通ってないように見えるが、リリースされてるので気にせず使う。 installボタンを押下し、対象プラグインをインストールする。 サンプルプログラムを動かす ワーキングディレクトリを作成し、helloworld.rbという名前のファイルを作成。 作成したファイルをVSCodeで開き、以下の行を追加する。 print "Hello World!" VSCode上部のTerminal > New Terminalの順に押下し、コンソール(PowerShell)を開く。 PS C:\Users\1417n> cd .\work\ PS C:\Users\1417n\work> ruby .\helloworld.rb Hello World! Rubyを実行できることを確認できた。 ライブラリを使用してみる HTTPクライアントのライブラリであるnet/httpを試す。 まずは、net/httpをインストールする。 PS C:\Users\1417n\work> gem install net-http Fetching: timeout-0.1.1.gem (100%) Successfully installed timeout-0.1.1 Fetching: io-wait-0.1.0.gem (100%) Successfully installed io-wait-0.1.0 Fetching: net-protocol-0.1.1.gem (100%) Successfully installed net-protocol-0.1.1 Fetching: uri-0.10.1.gem (100%) Successfully installed uri-0.10.1 Fetching: net-http-0.1.1.gem (100%) ERROR: Error installing net-http: net-http requires Ruby version >= 2.6.0. 失敗した。 Rubyのバージョンが2.6.0以上である必要があるとのこと。 Ruby 2.4を使いたかったが、2.6代にバージョンアップする。 WindowsでRubyをバージョンアップするには、インストールと同様にRubyInstallerを使えばいいらしい8。 以下のバージョンにアップデートする。 https://github.com/oneclick/rubyinstaller2/blob/master/CHANGELOG-2.6.md#rubyinstaller-268-1---2020-07-09 手順はインストールと同様なので、ログは省略。 PS C:\Users\1417n> ruby -v ruby 2.6.8p205 (2021-07-07 revision 67951) [x64-mingw32] 再度、net-httpのインストールをトライ。 PS C:\Users\1417n> gem install net-http Fetching net-http-0.1.1.gem Fetching timeout-0.1.1.gem Fetching io-wait-0.1.0.gem Fetching net-protocol-0.1.1.gem Fetching uri-0.10.1.gem Successfully installed timeout-0.1.1 Successfully installed io-wait-0.1.0 Successfully installed net-protocol-0.1.1 Successfully installed uri-0.10.1 Successfully installed net-http-0.1.1 Parsing documentation for timeout-0.1.1 Installing ri documentation for timeout-0.1.1 Parsing documentation for io-wait-0.1.0 Installing ri documentation for io-wait-0.1.0 Parsing documentation for net-protocol-0.1.1 Installing ri documentation for net-protocol-0.1.1 Parsing documentation for uri-0.10.1 Installing ri documentation for uri-0.10.1 Parsing documentation for net-http-0.1.1 Installing ri documentation for net-http-0.1.1 Done installing documentation for timeout, io-wait, net-protocol, uri, net-http after 1 seconds 5 gems installed インストールできたので、ライブラリを使ってみる。 今回は、阿部寛さんのサイトにGETリクエストを送信し、得られたhtmlを標準出力するスクリプトを作成する。 require 'net/http' print Net::HTTP.get('abehiroshi.la.coocan.jp', '/') 作成したスクリプトを実行。 PS C:\Users\1417n\work> ruby .\try_nethttp.rb <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS"> <meta name="GENERATOR" content="JustSystems Homepage Builder Version 20.0.6.0 for Windows"> <meta http-equiv="Content-Style-Type" content="text/css"> <title>�������̃z�[���y�[�W</title> </head> <frameset cols=18,82> <frame src="menu.htm" marginheight="0" marginwidth="0" scrolling="auto" name="left"> <frame src="top.htm" marginheight="0" marginwidth="0" scrolling="auto" name="right"> <noframes> <body></body> </noframes> </frameset> </html> 文字化けしてるが、ダウンロードできた。 本記事の内容は、以上となります。 https://www.ruby.or.jp/ja/tech/install/dev_env/ ↩ https://techplay.jp/column/549 ↩ https://github.com/sameersbn/docker-redmine/tree/4.1.1-8 ↩ https://www.ruby-lang.org/ja/news/2020/04/05/support-of-ruby-2-4-has-ended/ ↩ https://www.msys2.org/ ↩ https://www.javadrive.jp/cstart/install/index6.html ↩ https://github.com/oneclick/rubyinstaller2/tree/RubyInstaller-2.4.10-1#using-the-installer-on-a-target-system ↩ https://www.buildinsider.net/language/rubytips/0004 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む