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

Neri を使って Ruby スクリプトを実行ファイル(.exe)に変換して配布する

Ruby で書かれたスクリプトを Ruby の入っていない Windows 環境に向けて配布するツールとしては、OCRA という gem が有名です。 しかし OCRA にはいくつかの欠点1があったため、Neri という gem を作成しました。このたび ver 1.0 を公開し、今までより多くの Ruby スクリプトを実行ファイルに変換できるようになったので、Neri を使って Ruby スクリプトを実行ファイルに変換するチュートリアルを書いてみたいと思います。 Neri の目的 Neri は、ちょっとした CUI スクリプトや、あるいは DXRuby や Gosu を用いたゲーム、LibUI(あるいはそのラッパーである Glimmer DSL for LibUI)を用いた GUI プログラムなどを実行ファイルに変換し、Ruby の無い Windows 環境でも容易に動作させられるようにすることが目的です。 多くのライブラリを用いた大規模で複雑なプログラム(例えば Rails)を実行ファイル化することには向かないので、ご了承ください。 実行環境 Neri が動作するのは、Ruby Installer を用いてインストールされた Ruby 環境だけです。Windows 以外の環境(含 WSL)では動作しません。 また、.exe ファイルを作成するには Devkit 付きの Ruby Installer が必要です。ただし .bat ファイルを作成する機能もあり、それを使うのであれば Devkit は必ずしも必要ではありません。 この記事は「DXRuby で作ったゲームを .exe 化する」という状況を例にして書いていきます。Ruby Installer with Devkit および DXRuby はインストール済みなものとします。Neri は以下のように gem コマンドからインストールしてください。 gem install neri DXRuby は、この記事を書いている 2022年01月09日現在、Ruby 最新版である 3.1 には対応していません。(2.5~3.0 に対応。) また、64bit(x64) 版 Ruby では不安定な動作も多いので、32bit(x86) 版を使用することをオススメします。 (※ なお、Neri は Ruby のバージョンや 32/64bit に関係なく動作します。) なお、最近の多くの環境では DXRuby を使用するには d3dx9_40.dll が必要になります。その導入方法については下記リンク先を御覧ください。(d3dx9_40.dll は、インストールしている Ruby のフォルダの中の bin フォルダにコピーすることをオススメします。) Windows10では、DXRubyを動かすのに d3dx9_40.dllが必要 サンプルプログラム ⭐ ほしあつめ - GitHub 以下のようなファイル構成になっています。 image フォルダ:画像ファイルの入ったフォルダ src フォルダ:メイン以外のスクリプトの入ったフォルダ data フォルダ:その他のファイルの入ったフォルダ star.ico:実行ファイルのアイコン ほしあつめ.rb:メインの実行スクリプト Neri を用いて実行ファイルを作成する まず最初に一度、 ridk enable として開発環境にパスを通しておく必要があります。 基本 neri ほしあつめ.rb 基本は上のように、neri コマンドに続けて実行スクリプトを指定するだけです。 するとまずは一度スクリプトが実行されゲームが起動するので、× をクリックして終了してしまいましょう。 これで実行ファイル ほしあつめ.exe と、実行に必要なファイルを収めた system フォルダが作成されます。実際に .exe ファイルを実行して、ゲームが動作することを確かめてください。 アイコンを設定する neri --icon star.ico ほしあつめ.rb と、--icon オプションを使用することで .exe ファイルにアイコンを設定することができます。 実行に必要なファイルをデータファイルにまとめる ソースコード (.rb) をまとめる 今のままでは、配布するにあたっては data フォルダ image フォルダ src フォルダ system フォルダ ほしあつめ.exe をすべてまとめて配布する必要があります。実際にはここにさらに Readme とかも追加することになるでしょう。ちょっとゴチャゴチャしている感がありますね。 また、ソースコードが(ほしあつめ.rb も src フォルダ内のものも)そのままになってしまっているため、Ruby がちょっと分かる人であれば簡単に書き換えて改造することができてしまいます。 そこで、Neri にはそうしたファイルをデータファイルにまとめる機能があるので、それを使って配布するファイルを減らし、簡単には改造できないようにすることができます。 neri --icon star.ico ほしあつめ.rb src 2こうすると、system フォルダ内に ほしあつめ.dat というファイルが作成されます。src 内のファイル(および ほしあつめ.rb)はこのデータファイルに入っているのですが、require 等でそのまま読み込めるようになっています。つまりファイルを隠蔽したにもかかわらず、ソースコードを書き換える必要なくそのまま動作させることができます。 画像・音声ファイルをまとめる (DXRuby 使用時) さらに画像(あるいは音声)ファイルについても、DXRuby を使っている場合はソースコードを書き換えることなしに、ファイルをデータファイルに入れてしまうことができます。つまり neri --icon star.ico ほしあつめ.rb src image とすれば src と image フォルダ内のファイルがデータファイルに入るので、配布に必要なものは以下だけになります。 data フォルダ system フォルダ ほしあつめ.exe それ以外のファイルをまとめる まだ data フォルダが残っているので、これもまとめてしまいたいところです。しかし残念ながらソースコードや画像ファイル以外のファイルは、そのまま neri --icon star.ico ほしあつめ.rb src image data のようにしてデータファイルに追加しただけでは、うまく動作しません。 上のコマンドで作成した .exe ファイルを実行してみてもゲーム画面はおろかエラーメッセージも何も表示されないので、このままでは原因がわかりにくいですね。そうした場合には --bat オプションを使って .exe ではなく .bat を作ると、エラーメッセージが表示されるようになるので原因がわかりやすくなるでしょう。 neri --bat --icon star.ico ほしあつめ.rb src image data 作成された ほしあつめ.bat を実行すると、ほしあつめ.rb:27:in 'read': No such file or directory @ rb_sysopen - data/secret.txt (Errno::ENOENT) とのエラーで、data/secret.txt を読み込めていないことがわかります。こうした場合はソースコードにも手を入れる必要があります。 ほしあつめ.rb に、まずは一番上に ほしあつめ.rb require "neri" を追加しましょう。こうするとデータファイル内のデータを扱うためのメソッドが使えるようになります。 そして、25行目の ほしあつめ.rb SECRET_MESSAGE = File.read("data/secret.txt", encoding: "utf-8") を、以下のように変更します。 ほしあつめ.rb SECRET_MESSAGE = Neri.file_read("data/secret.txt", "utf-8") Neri.file_read は、データファイルがあるときにはそちらから、無ければ実際のファイルからデータを読み込みます。そのため普通に Ruby から実行した際にも、Neri で作った .exe ファイルを実行した際にも、同じ様にデータを読み込むことができます。 この上で neri --icon star.ico ほしあつめ.rb src image data と data フォルダ内のファイルもデータファイルに入れておけば、配布に必要なものは system フォルダ ほしあつめ.exe の 2 つだけになりました。非常にすっきりしましたね。 データファイルを暗号化する しかし、今のままでは問題があります。data/secret.txt は、10 点以上の点を取った人だけに見せたい秘密のメッセージです。しかし無理やりデータファイルを開いてみると、この秘密のメッセージがそのまま保存されてしまっていることがわかります。 それが気になるのであれば、--encryption-key オプションを使って暗号化しましょう。3 neri --encryption-key tekitounakey --icon star.ico ほしあつめ.rb src image data こうすればデータファイルを開いても、何が書いてあるのかわからなくなります。 出力先を別フォルダにする デフォルトでは Neri はカレントフォルダに実行ファイル等を作成しますが、--output-dir オプションを使って別のフォルダ内に作成するようにしてみましょう。 neri --output-dir ../starcollector --encryption-key tekitounakey --icon star.ico ほしあつめ.rb src image data 設定ファイルを作る 先程のような長いコマンドを何度も入力するのは大変です。そこで neri.config というファイルを作っておくと、そこから設定を読み込んでくれます。 neri.config --output-dir ../starcollector --encryption-key tekitounakey --icon star.ico ほしあつめ.rb src image data こうしておけば、 neri だけで実行ファイルを作ってくれます。 一部の設定だけを neri.config に書いておき、残りの設定を Neri 実行時に指定することもできます。 いちいち × をクリックして終了しなくても済むようにする 今の状態では、実行ファイルを作成するたびにいちいちゲームが起動してしまい、そのたびに × をクリックして終了する必要があります。 実行ファイル作成時には module NeriBuild が定義されているので、これの有無をチェックし 有るなら早期に4終了させてしまえば、いちいち × をクリックする必要がなくなります。 ほしあつめ.rbの6行目に追加 exit if defined? NeriBuild LibUI を使ったスクリプトを .exe 化する GUI ライブラリ LibUI を使ったスクリプトも問題なく .exe 化できることを確かめています。LibUI の Usage にある以下のサンプル(※ ただし 1 行目を追加)を Neri で .exe 化できることを確かめてみてください。 libui_example.rb require 'rbconfig' require 'libui' UI = LibUI UI.init main_window = UI.new_window('hello world', 200, 100, 1) button = UI.new_button('Button') UI.button_on_clicked(button) do UI.msg_box(main_window, 'Information', 'You clicked the button') end UI.window_on_closing(main_window) do puts 'Bye Bye' UI.control_destroy(main_window) UI.quit 0 end UI.window_set_child(main_window, button) UI.control_show(main_window) UI.main UI.quit 1 行目の require 'rbconfig' が無いと、スクリプトを実行した際は問題なく動作しますが、Neri で作った .exe ファイルを実行しようとするとうまくいきません。 Neri はデフォルトでは軽量化のために Rubygems を取り除いてしまうのですが、Rubygems が RbConfig を require しており、そして現行バージョン(0.0.13)の LibUI は RbConfig を(require 無しで)使用しているためです。 今後のバージョンでは、この点が改善され require 'rbconfig' が不要になるかもしれません。 最後に この Neri は実は 3 年ほど完全に放置してしまっていたプロジェクトだったのですが、GitHub でプルリクを送ってくださった方がいて、それで 3 年ぶりにやる気を出して正式版の公開にまでこぎつけることができました。この場を借りて御礼申し上げます。 作成当時は OCRA には「日本語ユーザー名の環境では実行できない」という欠点があったのですが、現在は解消されたようです。ただ、x64 版の Ruby を使っていると libssp-0.dll や libgmp-10.dll がデフォルトでは同梱されずエラーになることがあるようで、その場合 ↩ ocra foo.rb --dll ruby_builtin_dlls\libssp-0.dll --dll ruby_builtin_dlls\libgmp-10.dll のように明示的に dll を追加する必要があります。(以下参照) Ruby ocraで作ったexeを実行したら “libssp-0.dllが見つからない”と怒られた OCRA で Ruby スクリプトを .exe に変換するときの注意点 Neri はその点を(力技ですが)対処しているので、x64 環境でも問題なく実行ファイルを作成できます。 実行するスクリプトは、(オプションをのぞいて)一番最初に書く必要があります。つまり ↩ neri --icon star.ico src ほしあつめ.rb と順番を変えるとエラーになります。オプションは後ろに書いても大丈夫なので neri ほしあつめ.rb src --icon star.ico でも大丈夫です。 暗号化と言っても簡易的なものなので、つよつよエンジニアの手にかかれば解読可能です。重要なデータの暗号化には使わないでください。 ↩ 一通りライブラリのロードが終わってからにする必要があります。 ↩
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

rails 7.0では`config/initializers`配下のファイルが少なくなっている

概要 rails new直後のconfig/initializers配下の初期化ファイルの数が多くユーザの認知的負荷につながっていました。 その中には必ずしもすべてのアプリケーションに必要とは限らない設定や、過去のアップグレードの中で既に不要になっている可能性がある設定が存在していたため、今回ファイル構成が見直され不要あったと判断されたファイルが削除されました。 rails7.0以前 バージョン7.0以前のrailsではrails new時にアプリケーションの初期設定のファイルがconfig/initializers配下に10ファイル作成されていました。 $ rails -v Rails 6.1.4.4 $ rails new sample_app $ tree config/initializers/ config/initializers/ ├── application_controller_renderer.rb ├── assets.rb ├── backtrace_silencers.rb ├── content_security_policy.rb ├── cookies_serializer.rb ├── filter_parameter_logging.rb ├── inflections.rb ├── mime_types.rb ├── permissions_policy.rb └── wrap_parameters.rb rails7.0 rails7.0では認知的負荷を低減するために初期化ファイルの構成をシンプルにするため、初期化設定の一部をフレームワーク内のデフォルトの設定として定義することでrails new時に生成されるconfig/initializers配下ファイルの数を10ファイルから5ファイルに減らしています。 $ rails -v Rails 7.0.0 $ rails new sample_app $ tree config/initializers/ config/initializers/ ├── assets.rb ├── content_security_policy.rb ├── filter_parameter_logging.rb ├── inflections.rb └── permissions_policy.rb 削除されたファイルの解説 削除された初期化ファイルは以下の5つです。 application_controller_renderer.rb backtrace_silencers.rb cookies_serializer.rb mime_types.rb wrap_parameters.rb 各ファイルについての役割は以下の通りです。 application_controller_renderer.rb コントローラーの以外でviewテンプレートをrenderする際のデフォルト設定値を指定します。 多くのアプリケーションでは不要な設定であることと、少なくともrails new直後の状態では不要なため削除されたようです。 対応されたPR: https://github.com/rails/rails/pull/42538 backtrace_silencers.rb 任意の処理でbacktrace表示を無効化する設定ファイルです。 削除された理由についての詳細は書かれていませんが、このファイルが存在することにより上記の機能が提供されるメリットよりもinitializersファイルが増えてしまうことによる認知的負荷のデメリットの方が大きいと判断がされたようです。 対応されたPR: https://github.com/rails/rails/pull/43237 cookies_serializer.rb cookieのシリアライザの方式を指定するファイルです。バージョン4.1以降のrailsアプリではデフォルトで:marshalが定義されrails new時に作成されるconfig/initializers/cookies_serializer.rbによっての値を:jsonに上書きされていました。 背景としては、過去rails4.0から4.1へのバージョンアップの際に、互換性を維持する為デフォルトの設定は変更せず、新しく作るアプリケーションのみ変更するためにconfig/initializers/cookies_serializer.rbで上書きしてた為です。 rails7になりinitializersファイルを減らすため、デフォルト値が:jsonに変更されconfig/initializers/cookies_serializer.rbは不要になりました。 対応されたPR: https://github.com/rails/rails/pull/42538 mime_types.rb mime typeの追加を行うファイルです。アプリケーション固有のカスタムmime typeをすることも可能です。 削除された理由についての詳細は書かれていませんが、このファイルが存在することにより上記の機能が提供されるメリットよりもinitializersファイルが増えてしまうことによる認知的負荷のデメリットの方が大きいと判断がされたようです。 対応されたPR: https://github.com/rails/rails/pull/43237 wrap_parameters.rb これまでファイルの中で定義されていた以下の設定値がデフォルトの設定になりこのファイルは不要になりました。 ActiveSupport.on_load(:action_controller) do wrap_parameters format: [:json] end wrap_parameter自体についてはこちらの記事でも書いています。 対応されたPR: https://github.com/rails/rails/pull/43237
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

「フィボナッチ数を出力せよ」をRubyで

鍋谷さんの課題をやってみた。 コード めっちゃ恥ずかしいのだけれど、素朴なやり方しか思いつかなかった。 Ruby b, c = ARGV.map(&:to_i) tm = Time.now nxt = 1 + c b1 = 1 s, t = 0, 1 (0..).each do |n| break if Time.now - tm > 1.0 if nxt == n str = s.to_s result = "f(#{n})=" result << if (l = str.length) <= 5 str else str[0, 2] + "(ommit #{l - 4} digits)" + str[-2, 2] end puts result b1 *= b nxt = b1 + c end s, t = t, s + t end 結果 $ ruby -v ruby 3.0.0p0 (2020-12-25 revision 95aff21468) [x86_64-linux] $ ruby fibo.rb 12 12 f(13)=233 f(24)=46368 f(156)=17(ommit 29 digits)92 f(1740)=19(ommit 360 digits)80 f(20748)=53(ommit 4332 digits)76 f(248844)=93(ommit 52001 digits)08 $ ruby fibo.rb 34 25 f(26)=12(ommit 2 digits)93 f(59)=95(ommit 8 digits)41 f(1181)=29(ommit 243 digits)81 f(39329)=84(ommit 8215 digits)29 $ ruby fibo.rb 99 99 f(100)=35(ommit 17 digits)75 f(198)=10(ommit 38 digits)24 f(9900)=42(ommit 2065 digits)00 $ ruby fibo.rb 2 0 f(1)=1 f(2)=1 f(4)=3 f(8)=21 f(16)=987 f(32)=21(ommit 3 digits)09 f(64)=10(ommit 10 digits)23 f(128)=25(ommit 23 digits)61 f(256)=14(ommit 50 digits)67 f(512)=44(ommit 103 digits)69 f(1024)=45(ommit 210 digits)43 f(2048)=45(ommit 424 digits)01 f(4096)=46(ommit 852 digits)47 f(8192)=47(ommit 1708 digits)29 f(16384)=50(ommit 3420 digits)63 f(32768)=57(ommit 6844 digits)41 f(65536)=73(ommit 13692 digits)27 f(131072)=11(ommit 27389 digits)89 鍋谷さんの実行例より、一桁以上少ない。 そもそも tm = Time.now s, t = 0, 1 1000000.times do s, t = t, s + t end puts Time.now - tm #=>10.713040801 これで10秒以上かかってしまう。うーむ。 いいやり方、ありますかね。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Ruby】処理に名前をつけて使おう② calculate_price_with_taxメソッド

※初心者向け ※アウトプット練習の為 開発環境 rails 6.1.4.1 ruby 2.6.5 問題内容 以下のプログラムを実行するとエラーが起きます。 ①エラーが起きた原因 ②正しいソースコード(引数を用いたコードにしましょう) をそれぞれ答えてください。 実行したプログラム price = 300 def calculate_price_with_tax tax = 0.1 puts price + price * tax end calculate_price_with_tax 解答 ①エラーが起きた原因 メソッドの外側で定義した変数は、メソッドの内側では使えない。そのため、1行目のpriceはcalculate_price_with_taxメソッドの中では使えずにエラーが起きる。 ②正しいソースコード price = 300 def calculate_price_with_tax(price) tax = 0.1 puts price + price * tax end calculate_price_with_tax(price) 解説 メソッドの中と外は完全に別の世界となっています。そのため、メソッドの中から外にある変数を使ったり、逆にメソッドの外から中にある値を使うことはできません。 唯一、メソッドの中と外を繋ぐ役割が「引数」 と 「返り値」です。 それを踏まえて今回の問題を解説していきます。 ①エラーが起きた原因 解答の通り、エラーが起きた原因は変数priceです。今回の問題文のソースコードには変数priceが2度出てきます。 メソッドの外にある1行目のprice = 300と、メソッドの中にある5行目のprice + price * taxです。 問題有のソースコード price = 300 def calculate_price_with_tax tax = 0.1 puts price + price * tax end メソッドの中では、メソッドの外の変数を使うことができません(変数の使える範囲をスコープと言います)。 よって今回の問題文のソースコードでは、変数priceの定義はメソッドの外で行なっていたにも関わらず、メソッドの中で変数priceをそのまま使おうとしたことがエラーの原因でした。 ②正しいソースコード スコープの問題を解決するのが、メソッドの中と外を繋ぐ役割を持つ「引数」 と 「返り値」 です。 ①メソッドの外から中に値を渡す役割が「引数」 ②メソッドの中から外に値を渡す役割が「返り値」 今回は、メソッドの外から中に変数priceを渡すことで問題は解決します。つまり、解決に必要なのは①の「引数」 です。 引数の使い方は大きく2ステップです。 1.メソッドの呼び出しをメソッド名(渡したい値)と書く 2.メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く では今回の問題に当てはめてみましょう。 1. メソッドの呼び出しをメソッド名(渡したい値)と書く 今回、calculate_price_with_taxメソッドに渡したい値は変数priceなので、以下のようにメソッドを呼び出します。 calculate_price_with_tax(price) 2. メソッドの定義をdef メソッド名(受け取った値を入れる変数名)と書く 今回は値段の値を受け取りたいので、変数名はpriceにします。今回はメソッドの外の変数名priceと一緒ですが、別の名前にしても大丈夫です。 def calculate_price_with_tax(price) tax = 0.1 puts price + price * tax end よって引数を使って以下のように書き換えれば、問題文のソースコードのエラーは解決します。 price = 300 def calculate_price_with_tax(price) tax = 0.1 puts price + price * tax end calculate_price_with_tax(price)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsの関連付けのオプションについて

概要 前回のモデルの関連付けの種類の記事の続きです。 モデルの関連付けの際に使用できるオプションについてアウトプットしていきたいと思います。 前回の記事 環境 ruby: '3.0.1' rails: '6.1.4' 前提 今回説明するにあたって下記のモデルを想定しています。 usersテーブル id name 1 user1 2 user2 departmentsテーブル(所属部署を管理するテーブル) id name 1 営業部 2 開発部 Assignmentsテーブル(所属部署を管理するテーブル) id user_id department_id 1 1 1 2 1 2 3 2 1 オプションの種類 1. through throughは多対多の関係のモデル同士を関連付ける際に、そのモデル同士の中間に設置するモデルを経由させる際に使用します。 使い方 models/user.rb class User < ApplicationRecord has_many :assignments # まずは中間のモデルとの関連付け has_many :departments, through: :assignments # 多対多のモデルを関連付ける際にthroughオプションに中間のモデルを記載 end models/assignment.rb class Assignment < ApplicationRecord belongs_to :user # userと従属の関係 belongs_to :department # departmentと従属の関係 end models/department.rb class Department < ApplicationRecord has_many :assignments has_many :users, through: :assignments end 関連付けを行うことで下記のように直接departmentsやusersにアクセスできます。 user = User.find(1) user.departments #=> user1が所属する部署一覧を取得 department = Department.find(1) department.users #=> その部署に所属しているユーザーを取得 <備考> 中間テーブルの必要性 中間テーブルがなぜ必要かを説明します。 結論から言うと、テーブル設計の冗長性をなくすためです。 たとえば、一人のユーザーが営業部と開発部の両方に所属、また営業部には複数のユーザーが所属していると仮定します。 このような場合、テーブルを管理する際に下記のように所属部署が増えるたびにカラムが増えることになります。 usersテーブル id name department_id_1 department_id_2 ・・・ 1 user1 1 2 ・・・ departmentsテーブルも同様に所属ユーザーが増えればカラムが増えてしまいます。 これを解決するために中間テーブルを設置します。 Assignmentsテーブル(所属部署を管理するテーブル) id user_id department_id 1 1 1 2 1 2 3 2 1 ユーザーの所属部署を中間テーブル(Assignmentsテーブル)で管理することで usersテーブルやdepartmentsテーブルでは先程のような冗長性はなくなります。 2. foreign_key foreign_keyは外部キーを変更したい場合に使用するオプションです。 通常関連付けを行うと外部キーは'関連付けモデル名'+_idになります。 これを別の名称に変更することができます。 使い方 models/user.rb class User < ApplicationRecord has_many :assignments, foreign_key: 'user_number' end 上記のように記載することで参照元の外部キーをuser_idからuser_nubmer変更することができます。 フォロー、フォロワー機能の実装のように同じテーブル同士を中間テーブルを介して関連付けを行う際に使用したりします。 3. class_name class_nameは関連付けを行う関連名を変更する際に使用するオプションです。 関連名を変更してしまうと、どのモデルと関連付けされているのか判断できなくなるため 関連付け先のモデル名を記載します。 使い方 models/department.rb (他のモデルの設定は) class Department < Application has_many :assignments has_many :employees, through: :assignments, class_name: 'User' # class_name追加 end models/user.rb class User < ApplicationRecord has_many :assignments has_many :departments, through :assignments end models/assignment.rb class Assignment < ApplicationRecord belongs_to :user belongs_to :department end これにより下記のように参照の仕方を変えることができます。 department = Department.find(1) # class_name追加前 # department.users # class_name追加後 department.employees # 部署に所属してるユーザーが取得できる 4. dependent dependentはテーブルのデータが削除された際に関連付けられているデータも削除するときに使用します。 使い方 models/user.rb class User < ApplicationRecord has_many :assignments, dependent: :destroy end 上記のように設定するとユーザーが削除された際に紐付いているassignmentsテーブルのデータも削除されるようになります。 まとめ 以上がよく使われるオプションになります。 他にもオプションはたくさんありますので詳しく確認したい場合は下記参考文献を参照ください。 参考文献
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails 7.0.1 のプロジェクトで RSpec 実行環境をセットアップ

Ruby 3.0 x Rails 7 のプロジェクトで RSpec の実行環境を作る方法をメモ的に記します。 具体的には RSpec と FactoryBot gem をインストールして設定していきます。 # 環境情報 $ ruby -v ruby 3.0.3p157 (2021-11-24 revision 3fb7d2cadc) [arm64-darwin21] $ rails -v Rails 7.0.1 結論からいうと Rails 7 独自の設定は特に必要ありません。 プロジェクトを作成 Rails 7 では rails new のオプションでフロントエンド関連の色々を指定できますが、特に指定してません。 $ rails new rails7_rspec RSpec 環境用の gem をインストール rails new した時に rails7_rspec ディレクトリに生成された Gemfile に追記します。 group :development, :test do gem "debug", platforms: %i[ mri mingw x64_mingw ] gem "rspec-rails" # 追加 gem "factory_bot_rails" # 追加 end Gemfile に従って gem をインストールします。 $ bundle install 各種 gem を設定 RSpec を設定 RSpec の基本設定は rails のジェネレータコマンド (rails) を使って作成します。 rails g rspec:install これで rspec コマンドから RSpec を即時実行できるようになります。 試しに叩いてみると実行されるはずです。(テストは作ってないので 0 examples になります。) $ rspec No examples found. Finished in 0.0002 seconds (files took 0.07517 seconds to load) 0 examples, 0 failures FactoryBot を設定 RSpec のテストコードで FactoryBot のメソッドを使う際、クラス名 (FactoryBot) を省略できるようにしておくと便利です。 省略するためには RSpec の基本設定をした時に自動生成された spec/rails_helper.rb ファイルに追記します。 spec/rails_helper.rb RSpec.configure do |config| # RSpec.configure ブロックの中に追記 config.include FactoryBot::Syntax::Methods end この記述により、以下のように FactoryBot というクラス名をつけなくても FactoryBot のメソッドを spec ファイル内で呼び出せるようになります。 user = create(:user) # 参考:クラス名をつける場合  user = FactoryBot.create(:user)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Rails】paramsについて

paramsとは? →データの入れ物 どんなデータが入ってるのか? 基本的には以下の2種類の方法で収集されたデータが入ってる。 ・投稿フォームなどからPOSTで送信されたデータ ・getのクエリパラメータ 【クエリパラメータとは?】 例えば、基本のURLが「https:// ○△×□.jp/」だとして、基本のURLにクエリ文字列(URLパラメーター)を加えると「https:// ○△×□.jp/?●=▲×■&○=△×□」となります。 「?●=▲×■&○=△×□」の部分が、クエリパラメーター(URLパラメーター)です。 引用:https://online.dhw.co.jp/kuritama/query-string/
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby] Stringクラスのindexメソッド

学習したことのアウトプットとして indexメソッド Rubyの組み込みライブラリ index(pattern, pos = 0) -> Integer | nil 文字列のインデックス pos から右に向かって pattern を検索し、最初に見つかった部分文字列の左端のインデックスを返す。 見つからなければ nil を返す。 引数 pattern は探索する文字列または正規表現で指定 引数 pos が負の場合、文字列の末尾から数えた位置から探索する、0の場合省略可 例) "astrochemistry".index("str") # => 1 "regexpindex".index(/e.*x/, 2) # => 3 "character".index(?c) # => 0 "foobarfoobar".index("bar", 6) # => 9 "foobarfoobar".index("bar", -6) # => 9 ※補足等があればコメントいただけると幸いです
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Ruby] Integerクラスのeven?メソッド

学習したことのアウトプット even?メソッド Rubyの組み込みライブラリ 自身が偶数であれば真を返し、そうでない場合は偽を返す。 例) 10.even? # => true 5.even? # => false ※補足等ある場合はコメントしていただけると幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

新規Railsアプリを作成するには

まずはターミナル上で、下記を実行する。 新規アプリ名(例:tweet)を入力、 -dオプションでMySQLを使用することを明示 % rails new tweet -d mysql
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

クラスとインスタンスの違いを簡潔にまとめる

はじめに どんどんアップデートしていく記事にしていこうと思っています。 結論 クラス全体で共通した振る舞いを示す クラスから生成されたインスタンスの振る舞いを示す 属性と属性値の関係 属性はみんなが共通で持っている項目で属性値は個別で異なる
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む