20220111のRubyに関する記事は11件です。

[Ruby] シングルクオートとダブルクオートに違いがあるって知らなかった。

はじめに 初学者ですが、いくつかアプリを制作し慣れてきていたと自覚していた私ですが、まだまだ奥が深く面白いのがプログラミングであるなと更に思わされました。 Rubyに関する本を読み、「そんな理由があるんだ!」と思わされた事を紹介させてください。 シングルクオート、ダブルクオートとは どちらも文字列を作る為にある Rubyでは文字列を作る方法として、シングルクオート、ダブルクオートで囲む方法があります。 'シングルクオート' "ダブルクオート" 私の知識ではどちらでもよく、好みにより使い分けたり見やすくするために使い分けることがあるのだと思っていました。 どんな時に違いがあるのか? バックスラッシュ記法を使用する時 \nは"”で囲まれている文字列を改行させる ちなみに\←はmacだとoptionを押しながら¥を押すと表示させることができます。 //シングルクオートの場合 'おはよう\nおやすみ' => おはよう\nおやすみ //ダブルクオートの場合 "おはよう\nおやすみ" => おはよう おやすみ ダブルクオートでしか機能しません! \nの他にも\r、\tなどの特殊文字などもあります。 ↓バックスラッシュ記法については以下参考記事にてまとめられています。 バックスラッシュ記法 式展開を使用する時 #{}の中に変数を入れ、変数の値を文字列に埋め込む //シングルクオートの場合 name = '太郎' puts 'おはよう、#{name}' => おはよう、#{name} //ダブルクオートの場合 name = "太郎" puts "おはよう、#{name}" => おはよう、太郎 ダブルクオートでしか式展開されない! おわりに 最後にまで読んでくださった方ありがとうございます。 アウトプットの仕方などこうした方がもっといい記事になるなどご教授いただけたら嬉しいです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby on Rails 日時データを年月日の形式で表示する

日時データを年月日で表示したい scheduleというテーブルの中から、startという日時データのカラムの値を表示したい時、 <%= schedule.start %> ↑こんな感じで書くと ↑こんな感じで表示される。 これを、年月日だけで表示していきたい。 対処法 <%= schedule.start&.strftime("%Y年 %m月 %d日") %> ↑このように書くと、 ↑こんな感じで表示される。 時分秒まで表示する 更新日時(updated_at)など、何時何分何秒の部分を表示したい時は、 <%= schedule.updated_at&.strftime("%Y年 %m月 %d日 %H時 %M分") %> こんな感じの書き方になる。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】ActionController::RoutingError (uninitialized constant HogeControllerの対処法

症状 railsで新たにアクションを追加したときに下記エラーメッセージが表示されました。 翻訳すると「初期化されていない定数hogeController」でした。 error ActionController::RoutingError (uninitialized constant HogeController routeファイルとhoges_contollerファイルは以下です。 routes.rb post 'hoge', to: 'hoge#update' hoges_contoller class HogesController < ApplicationController end 解決方法 routeファイルのhogeをhogesに変更することで解決しました。 route.rb post 'hoge', to: 'hoges#update' 下記の記事ではファイル名が間違っていたため同様のエラーが出ていたようです。 このエラーでは、ファイル名やルーティングの名前が正しくないと出てくるようです。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】dynamic constant assignmentの対処法【Ruby】

症状 railsで以下エラーが発生しました。 翻訳すると、「動的定数の割り当て」でした。 error SyntaxError (C:/app/controllers/api/v1/users_controller.rb:21: dynamic constant assignment YOUR_DOMAIN = 'http://localhost:3000' ^~~~~~~~~~~ users_controller.rb def update user = User.find_by(id: params[:userId]) DOMAIN = 'http://localhost:3000' if(user.save!(user_params) redirect_to DOMAIN + '?success=true', else redirect_to DOMAIN + '?canceled=true', end end 解決方法 ApplicationControllerに移動して、解決しました。 定数をアクション内で書いたから怒られていたようです。 application_controller.rb DOMAIN = 'http://localhost:3000' 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】クラスとインスタンスの概念を用いたコードの作成

※初心者向け ※アウトプット練習の為 開発環境 rails 6.1.4.1 ruby 2.6.5 問題内容 class Article def initialize(author, title, content) @author = author @title = title @content = content end end 上記のコードに追加を行い、以下の出力結果を得られるようにしてください。ただし、クラスとインスタンスを使用するものとします。 著者: 阿部 タイトル: Rubyの素晴らしさについて 本文: Awesome Ruby! 解答 class Article def initialize(author, title, content) @author = author @title = title @content = content end def author @author end def title @title end def content @content end end article = Article.new("阿部", "Rubyの素晴らしさについて", "Awesome Ruby!") puts "著者: #{article.author}" puts "タイトル: #{article.title}" puts "本文: #{article.content}" 解説 (23行目)Article.newでインスタンスを生成し、変数articleに代入します。その際に、阿部、Rubyの素晴らしさについて、Awesome Ruby!の3つ実引数を指定します。 (3〜7行目)initializeメソッドを定義して、インスタンス変数を宣言しました。実引数として指定した値を、仮引数のauthor、 title、contentにそれぞれ渡しています。 そうすることにより、initializeメソッドで宣言されたインスタンス変数に、阿部、Rubyの素晴らしさについて、Awesome Ruby!という3つの値が代入されます。 (9〜19行目)上記インスタンス変数の値を返すための専用のメソッドをそれぞれ定義しています。 (24〜26行目)最後に、9〜19行目で定義づけたメソッドを呼び出しています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Ruby3.1.0のbundle installでpuma5.5.2がダウンロードできなかった時

環境 macOS 12.1 (Monteray) ruby 3.1.0p0 (2021-12-25 revision fb4df44d16)[arm64-darwin21] Rails 7.0.1 Apple clang version 13.0.0 (clang-1300.0.29.30) 要約 bundle config build.puma CC="clang -fdeclspec" でbundle installの実行時にオプションを渡して bundle install を実行。 出ていたエラーメッセージなど Rails7.0.1でrails newした後Gemを入れようとしてbundle installを実行するとこんな感じのエラーが発生しました。(一部省略) current directory: /rails/rails7-try/vendor/bundle/ruby/3.1.0/gems/puma-5.5.2/ext/puma_http11 /.anyenv/envs/rbenv/versions/3.1.0/bin/ruby -I /.anyenv/envs/rbenv/versions/3.1.0/lib/ruby/3.1.0 -r ./siteconf20220111-40100-3sw1db.rb extconf.rb --with-cflags\=-Wno-error\=implicit-function-declaration checking for BIO_read() in -lcrypto... *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir /.anyenv/envs/rbenv/versions/3.1.0/bin/$(RUBY_BASE_NAME) --with-puma_http11-dir --without-puma_http11-dir --with-puma_http11-include --without-puma_http11-include=${puma_http11-dir}/include --with-puma_http11-lib --without-puma_http11-lib=${puma_http11-dir}/lib --with-openssl-dir --with-openssl-include --without-openssl-include=${openssl-dir}/include --with-openssl-lib --without-openssl-lib=${openssl-dir}/lib --with-openssl-config --without-openssl-config --with-pkg-config --without-pkg-config --with-crypto-dir --without-crypto-dir --with-crypto-include --without-crypto-include=${crypto-dir}/include --with-crypto-lib --without-crypto-lib=${crypto-dir}/lib --with-cryptolib --without-cryptolib /.anyenv/envs/rbenv/versions/3.1.0/lib/ruby/3.1.0/mkmf.rb:498:in `try_do': The compiler failed to generate an executable file. (RuntimeError) You have to install development tools first. To see why this extension failed to compile, please check the mkmf.log which can be found here: /rails/rails7-try/vendor/bundle/ruby/3.1.0/extensions/arm64-darwin-21/3.1.0/puma-5.5.2/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /rails/rails7-try/vendor/bundle/ruby/3.1.0/gems/puma-5.5.2 for inspection. Results logged to /rails/rails7-try/vendor/bundle/ruby/3.1.0/extensions/arm64-darwin-21/3.1.0/puma-5.5.2/gem_make.out An error occurred while installing puma (5.5.2), and Bundler cannot continue. In Gemfile: puma ログを見ろと言っているのでログを見ているとこんな感じ(一部省略)になっており、どうやらパラメータを渡せとのこと。 /.anyenv/envs/rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/assert.h:132:1: error: '__declspec' attributes are not enabled; use '-fdeclspec' or '-fms-extensions' to enable support for __declspec attributes RBIMPL_ATTR_NORETURN() ^ ^ /.anyenv/envs/rbenv/versions/3.1.0/include/ruby-3.1.0/ruby/internal/attr/noreturn.h:29:33: note: expanded from macro 'RBIMPL_ATTR_NORETURN' # define RBIMPL_ATTR_NORETURN() __declspec(noreturn) ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] 20 errors generated. checked program was: /* begin */ 1: #include "ruby.h" 2: 3: int main(int argc, char **argv) 4: { 5: return !!argv[argc]; 6: } /* end */ どういうふうに渡せば良いのかわからないので調べていると下記の記事を発見したので参考にさせて頂きました。 ただbundle install時に渡したかったので bundle config build.puma CC="clang -fdeclspec" を実行してホームディレクトリ配下の.bundle/configに値をセット。 ファイルを見ると BUNDLE_BUILD__PUMA: "CC=clang -fdeclspec" と追加されているのがわかります。 この状態で bundle install を実行すると問題なくインストールできました。 意外とハマったので共有します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】同じscopeはmoduleに共通化しよう

複数のクラスに共通するscopeがあるとき、moduleとして共通化する。 before author.rb class Author < ApplicationRecord scope :active, -> { where(state: 'active') } end book.rb class Book < ApplicationRecord scope :active, -> { where(state: 'active') } end after models/concerns/active_scope.rb module ActiveScope extend ActiveSupport::Concern included do scope :active, -> { where(state: 'active') } end end author.rb class Author < ApplicationRecord include ActiveScope end book.rb class Book < ApplicationRecord include ActiveScope end RSpec モデルと同じようにテストする spec/models/active_scope_spec.rb require 'rails_helper' RSpec.describe ActiveScope, type: :model do describe '#active' do it '' do ... end end end 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ログインしていない人がアクセスできるページを制限する

authenticate_user!で書くアレと、move_to_index(じゃなくてもいいけどこの名前でよく作ってる)アレの使い途がごっちゃになっていたので整理してみたくなり。 まずは、authenticate_user!について書いてみる。 authenticate_user! deviseを導入していると使えるメソッド。 処理が呼ばれた段階で、そのユーザーがログインしていなければ、ログイン画面に強制的に飛ばせます(っ'-')╮=͟͟͞͞ポイッ 書く場所はApplicationController。 どのコントローラーで処理するにも共通した処理を書ける場所。 便利だなと思う反面、影響力強い×触る頻度少ないのでいつもどきどきしながら書く。 application_controller.rb class ApplicationController < ActionController::Base before_action :basic_auth before_action :configure_permitted_parameters, if: :devise_controller? before_action :authenticate_user!, only:[:show, :new] # ←ココ private def basic_auth xxxxx end def configure_permitted_parameters xxxxx end end onlyとはこのbefore_action :authenticate_user!が発動する機会を限定するもの。 この書き方だと、showアクション、newアクションの時のみauthenticate_user!が動きます。 onlyで指定するのが1つだけのときはonly: :showと書く。:と:の間スペース空けるの忘れないように。 exceptで限定することもできる。 before_action :authenticate_user!, except: :index こんな感じ。 exceptは「コレには適用しない」というonlyと逆の使い方。 ↑の場合はindexアクション以外の時はauthenticate_user!が動きます。 最初↑↑のonlyの書き方をしていたけど、今回私の作っているのはindex以外はログインしないと見れない、で良かったのでこの記事書きながら変更しましたっ。 まとめ ・authenticate_user!でログインしていないユーザーを、ログイン画面に強制的に飛ばせる(*deviseを導入してること) ・書く場所はApplicationController ・onlyまたはexceptを使うと発動する機会を限定できる こんな感じでしょうか! 間違ってること、もっとこうしたらいいよというアドバイスなどありましたら、コメントいただけると嬉しいです! では、また次の投稿で。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

intee プログラミングゼミを経ての感想

2022.01.11 2021年12月2日〜12月24日まで参加したゼミについての感想、今後の展望について [感想] ・とにかく学びが多い! 今回はRuby/Githubを使って開発したが、前回はPHP/htmlを使ってパスワード付きの掲示板を作った。 同じようなサービスを作る過程でも違う箇所が多く勉強になった 特に今回はRubyを立ち上げるところからのスタートだったので、より実践的に感じた command+Sでセーブなどショートカットも覚えた! ただカリキュラムに甘え、分からない専門用語が多いのでそこは勉強が必須 ・自走力がついた 初回の授業でパソコンが動かず、大きな遅れを取ったのでゼミ外で自主開発をしていた カリキュラムに記載されていない予想外のエラーが出ることが多かった 最初は絶望し先生方に相談するしかなかった →次第にエラー内容の見方も分かり、自分で解決を試みるようになった ありがちなエラー:if/end/{}の書き忘れなど また時間を見つけて一人でも取り組むようになった ・まだ完走出来ていない 最後でエラーが続き、あともう少しのところで止まっている 今週は時間があるので完走+UI/UXのところまで手を伸ばしたい [今後の展望] ・今週中にカリキュラム完走 ・UI/UXも手を付ける ・カルーセルも作りたい ・専門用語の勉強
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

任意の文字列から特定の連続する文字列を探し、その直前の値により「True」または「False」を出力するプログラムを実装

任意の文字列から特定の連続する文字列を探し、その直前の値により「True」または「False」を出力するプログラムを実装します。 以下の要件を満たすxyz_thereメソッドを実装します。 任意の文字列から連続する文字列"xyz"を探し、その直前にピリオド(.)がない場合はTrueを出力する 任意の文字列から連続する文字列"xyz"を探し、その直前にピリオド(.)がある場合はFalseを出力する 上記2つの条件に当てはまらない場合はFalseを出力する 出力例 xyz_there('abcxyz') → True xyz_there('abc.xyz') → False xyz_there('xyz.abc') → True xyz_there('azbycx') → False xyz_there('a.zbycx') → False include?メソッドを使いましょう。 include?メソッドは、指定した要素が配列または文字列に含まれているかを判定するメソッドです。 str = "foobar" puts str.include?("bar") #=> true puts str.include?("hoge") #=> false 出力例 def xyz_there(str) if str.include?(".xyz") puts "False" elsif str.include?("xyz") puts "True" else puts "False" end end xyz_there('abcxyz') ここ重要↓ include?を用いて、対象となる文字列が含まれているかどうかを、各条件式で判別しています。 ポイントとしては、str.include?(".xyz")の条件式をstr.include?("xyz")より前に設置することです。 例えば"abc.xyz"という文字列の場合は、str.include?("xyz")においてもtrueとなってしまうため、先に".xyz"を含むかどうかを判別する必要があります。 どうしても初心者だと puts "True"を先に書きたくなるところですが、そんなに甘くはないですね。 もっと勉強が必要だと改めて感じました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】routesのエラー「``': No such file or directory 」の対処法

症状 railsで新たにアクションを追加しようと、routeファイルにルートを追加してサーバーを起動したところ下記のエラーが発生しました。 翻訳すると、「そのようなファイル、又はディレクトリはありません」でした error rails s => Booting Puma => Rails 6.0.4.1 application starting in development => Run `rails server --help` for more startup options Exiting D:/app/config/routes.rb:28:in ``': No such file or directory - checkout (Errno::ENOENT) from C:/appu/config/routes.rb:28:in `block (3 levels) in <main>' from C:/Ruby30-x64/lib/ruby/gems/3.0.0/gems/actionpack-6.0.4.1/lib/action_dispatch/routing/mapper.rb:956:in routesファイルの該当の箇所は以下です。 routes.rb post `checkout`, to: `stripes#checkout` 解決方法 ルーティングしている``を''に変更することで解決しました。 ファイルがないというより、指定の仕方が悪かったからファイルがないと怒られていたようです。 routes.rb post 'checkout', to: 'stripes#checkout' 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む