Ruby

新しいItemの作成

Items

最新コメント

activerecordでは、firstを使った方が実装とSQLが揃って可読性が上がる

takuma_tech Takuma @takuma_tech

こちらの記事によると、activerecordでlastを使った場合、指定したorderを逆にして"LIMIT 1"とするSQLが発行されるそうです。

一方で、firstを使った場合、指定したorderはそのままで"LIMIT 1"とするSQLとなるので、railsのコードとSQLの対応関係が分かりやすくなります。

したがって、lastよりもfirstを使った方が実装とSQLが揃って可読性が上がるということがこの記事で主張されていました。 ご参考まで。

0
Raw
https://www.techtips.page/ja/comments/304
🔧1
💡1
❤️1

commonmarker v1.xは、出力の編集が必要ならまだ時期尚早?

wakairo @wakairo
最終更新

2023/12/25にcommonmarker v1.0.0がリリースされました。 それから4ヶ月以上が経過していますが、v1.xを採用せずにv0.xに留まっているライブラリやプロジェクトが多いように見受けられます。

たとえば、 jekyll-commonmarkのgem指定commonmarker-rougeのgem指定は、 2024/05/13現在ではv0.xになっています。

v0.xで出来ていた編集操作がv1.xではまだ出来ない?

commonmarkerにMarkdownを入力して、出力されたHTMLをそのまま使う分には現在のv1.xで十分でしょう。 しかし、スタイル変更やJavaScriptによる機能付与などで、出力されるHTMLを多少変更したいことがあります。 v0.xではこういうときに使えるものとして、任意のHTMLを挿入する方法があったのですが、少なくともこのv0.xの方法はv1.xでは出来なくなったようです。

Pluginの活用か何かで、v1.xでもv0.xと同じように、出力のHTMLを部分的に好き勝手な形に編集することは出来るのでしょうか? ご存じの方がいらっしゃいましたら、コメントをいただけると嬉しいです。

0
Raw
https://www.techtips.page/ja/comments/293
😿1

WSL2上にてrails serverで立ち上げたサーバに別デバイスからのアクセスを可能にする方法

wakairo @wakairo
最終更新

別デバイスからhttpsでrails serverにアクセスする方法

前述の方法で別デバイスからhttpでアクセスできるようになりますが、httpsでアクセスする必要がある場合には、 local-ssl-proxyを使ってhttpsをhttpに振り向けることで、httpsアクセスが可能になります。具体的な方法は以下をご覧ください。 なお別デバイスからhttpsでアクセスするには、前述のポートフォワーディングとファイアウォールの設定をhttpsのポート番号で行う必要があります。

0
Raw
https://www.techtips.page/ja/comments/292
🔧1
💡1

w3c_validators gemでNu validatorのコンテナイメージを利用する場合

kenicode SatoKen @kenicode

Nu validatorのコンテナイメージであるghcr.io/validator/validator:latestをローカルで走らせて、 これをw3c_validatorsW3CValidators::NuValidatorから使う場合は、以下ようにuriを指定してnewすれば動きます。

validator = W3CValidators::NuValidator.new(:validator_uri => 'http://localhost:8888/')

ちなみに、ローカルで走らせたNu validatorに切り替えたところ実行時間がだいぶ減りましたので、w3c_validatorsが遅いと感じている方はローカル実行を試すと良いかもしれません。慣れればコンテナを走らせるのはサクッと出来ますよ。

2
Raw
https://www.techtips.page/ja/comments/286
🔄1
🔧1

captureを使ってform_withのようにblockを活用したヘルパーメソッドを作る

wakairo @wakairo
最終更新

背景

Railsのactionviewのヘルパー関数には、form_withのように、blockを活用して入れ子のHTML要素を記述できる便利なヘルパーメソッドがあります。 具体的には、以下のような記述(Railsガイドより引用)が出来るヘルパーメソッドです。

<%= form_with url: "/search", method: :get do |form| %>
  <%= form.label :query, "Search for:" %>
  <%= form.text_field :query %>
  <%= form.submit "Search" %>
<% end %>

blockを用いてHTML要素の入れ子を出力できるこのようなヘルパーメソッドの自作に関する話です。

作り方

actionviewのcaptureというヘルパーメソッドを用いると、form_withのように、blockを使ってHTML要素の入れ子を記述できるヘルパーメソッドを自作できます。

ちなみに、このcaptureは、Railsガイドを読んでも、RailsのAPIドキュメントを読んでも、いまいち使い道が分かっていなかったのですが、このような自作ヘルパーで使うというのが1つの使い道のようです。

自作ヘルパーメソッドの実装例

def some_helper(content=nil, &block)
  object_passed_to_block = 'hello, capture'
  content = capture(object_passed_to_block, &block) if block
  tag.div(content, class: 'some-class')
end

自作ヘルパーメソッドの利用例

ERBから利用
<%= some_helper do |object| %>
  <p><%= object %></p>
<% end %>
出力結果
<div class="some-class">
  <p>hello, capture</p>
</div>
Rubyのコード内から利用
some_helper do |object|
  tag.p(object)
end
出力結果
<div class="some-class"><p>hello, capture</p></div>
Rubyのコード内からblockなしで利用
some_helper('123')
出力結果
<div class="some-class">123</div>
0
Raw
https://www.techtips.page/ja/comments/281
🔧1
💡1

importmap-railsは、2.x系でiOS 16.3以前のサポートを打ち切りました。

wakairo @wakairo
最終更新

問題

importmap-railsはv2.0.0で、「ネイティブでImport mapsに対応していないブラウザでImport mapsを機能させるためのshims」の利用を打ち切りました。 一方で、iOS 16.3以前に搭載されているSafariブラウザは、ネイティブではImport mapsに対応していません。 したがって、importmap-railsを1.x系から2.x系にバージョンアップすると、iOS 16.3以前のデバイスではJavaScriptを利用したRailsアプリが動かなくなります。 このことは、この打ち切りのプルリクエスト #216で議論されているように、開発陣に既に認識されており、認識した上での打ち切りとなっています。

なお、特にiOS 15は、2024-01-22にセキュリティアップデートが出ているAppleがサポートをまだ続けているOSであるにもかかわらず、最新の15.8.1へアップデートしたデバイスであってもRailsアプリが動かなくなるため要注意です。

(参考)iOS 15とiOS 16の状況

以上から、iOS 15とiOS 16のデバイスは、2024年2月現在まだまだ利用されていると言えます。

回避策

importmap-railsを用いたRails 7アプリで、iOS 16.3以前をサポートするには、 以下のようにjavascript_importmap_tagsの前にes-module-shimsを入れます。 詳細は、GitHubの公式リポジトリのREADMEの該当部分(Supporting legacy browsers such as Safari on iOS 15)を参照してください。

<script async src="https://ga.jspm.io/npm:[email protected]/dist/es-module-shims.js" data-turbo-track="reload"></script>
<%= javascript_importmap_tags %>

参考情報

0
Raw
https://www.techtips.page/ja/comments/277
😄1
🔄1
😿1
💯1

WSL2上にてrails serverで立ち上げたサーバに別デバイスからのアクセスを可能にする方法

wakairo @wakairo
最終更新

背景

WindowsのWSL2環境でRailsアプリを開発しています。開発しているWebアプリに関してAppleのSafariブラウザでの動作確認が必要になりました。そこで、同一LAN内にあるiPhoneやiPadといった別デバイスから、WSL2環境においてrails serverコマンドで走らせたサーバへ、アクセスできるようにしました。

手順

LAN接続の設定

後述のファイアウォールの設定にて、プライベートネットワークに限定する設定をする場合には、Railsサーバを走らせているPCのLAN設定で、ネットワーク プロファイルをプライベートにしておきます。

WSL2で走っているLinuxのIPアドレスの確認

ifconfigの出力のinetのところなどで、WSL2で走っているUbuntuなどのLinux OS側のIPアドレスを確認し、転送先アドレスとして控えます。

LinuxのIPアドレスが正しいことの確認

まず、bin/rails server -b 0.0.0.0でWSL2上でRailsサーバを起動します。
次に、このRailsサーバに、WSL2環境ではなくWindows上で普通に走っているブラウザから、先ほど調べたWSL2で走っているLinuxのIPアドレスに対し http://(LinuxのIPアドレス):3000/ というようなアドレス(ここではポート番号を3000としていますが、別のポートをRailsサーバに用いている場合はそのポート番号に変更して下さい)でアクセス出来ることを確認します。
ここでアクセスに失敗するようでは何かしらが間違っていますので、まずはこのようにアクセス出来るようにしましょう。

ホストOSであるWindowsのIPアドレスの確認

ipconfigなどで、Windows側、つまり、ホストOS側のLAN上でのIPアドレスを確認し、転送元アドレスとして控えます。

ポートフォワーディングの設定

管理者権限で以下のコマンドを実行します。なお、特に理由が無ければ、転送元ポートは転送先ポートと同じ(3000)で大丈夫です。

netsh interface portproxy add v4tov4 listenaddress=<転送元(Windows)のIPアドレス> listenport=<転送元ポート> connectaddress=<転送先(Linux)のIPアドレス> connectport=<転送先ポート>
ファイアウォールの設定

Windowsのファイアウォールの設定にて、「受信の規則」として以下の設定を追加します。

  • プロトコルの種類:「TCP」
  • ローカルポート: 「特定のポート」「3000(転送元ポート)」
  • リモートポート: 「すべてのポート」

なお、ファイアウォールの設定にて、プライベートネットワークに限定したり、テスト時以外は無効にしたりするなど、セキュリティには十分に配慮をして下さい。

接続確認

同一LAN内の別デバイスから、 http://(WindowsのIPアドレス):(転送元ポート)/ というようなアドレスでアクセス出来ることを確認します。

参考情報

0
Raw
https://www.techtips.page/ja/comments/274
😄2
🔧1
💡1
❤️1

meta-tags側のtruncateでは、スペース文字のところで切り詰めが行われます

wakairo @wakairo
最終更新

問題

meta-tagsはtitleやdescriptionをSEOに適切な長さまでに切り詰めますが、titleなどの中にスペース文字が含まれていると、スペース文字のところで切り詰めてしまいます。そのため、文章の先頭付近のみにスペース文字がある文章は大幅に切り詰めが行われてしまいます。
例えば、次の文章にあるスペース文字は10文字目のところのみです。

Microsoft Copilotは、あなたの言葉をパワフルなコンテンツに変えるAIアシスタントです。あなたのニーズに合わせて、文章を生成、要約、編集、変換したり、コードや詩などの創造的なコンテンツを作成したりします。

したがって、80文字に切り詰める設定であっても、この10文字目のところで切り詰められて「Microsoft」となり、80文字に比べ大幅に短い文字数に切り詰められることになってしまいます。

回避策

回避策はいくつかあります。

v2.21.0で追加された'truncate_on_natural_separator'の設定を利用する

設定ファイルであるmeta_tags.rbの中で、以下の記述を行うことで、スペース文字のところで切り詰めなくなります。詳細はmeta-tagsの設定truncate_on_natural_separatorの説明をご覧ください。

config.truncate_on_natural_separator = nil

アプリケーション側で切り詰めを行う

meta-tagsに渡す前に、あらかじめアプリケーション側で切り詰めを行うことでも、この問題は回避できます。なお、meta-tagsの設定によっては、meta-tags側での切り詰めをオフにすることも出来ます。設定方法についてはmeta-tagsのREADMEを参照してください。

(参考)内部的な原因

meta-tagsはRuby on Railsのtruncateヘルパーメソッドを最終的に呼び出しますが、このヘルパーメソッドをラップするメソッドを内部に持っています。このラッパーメソッドの引数であるnatural_separatorを省略してのメソッド呼び出しがmeta-tags内に存在し、v2.19.0までは、この省略時のnatural_separatorのデフォルト値がスペース文字であるため、スペース文字のところでの切り詰めが発生しています。

v2.21.0からは、前述の引数natural_separatorが廃止され、ラッパーメソッド内で前述の'truncate_on_natural_separator'の設定値が与えられるようになっています。ですのでこの設定値を変えることで、スペース文字のところで切り詰めなくしたり、任意の文字での切り詰めたりすることが可能になりました。

0
Raw
https://www.techtips.page/ja/comments/269
😄1
🔄1
🔧1
😿1

rails 7.0からrails 7.1への移行(アップデート、アップグレード)で必要な作業

wakairo @wakairo
最終更新

Rails 7.1でのaction_dispatch.show_exceptionsの変更への対応方法

対応の基本的な方向性

config.action_dispatch.show_exceptionsを今後のデフォルトとなる:rescuableに設定してbin/rails testでテストを実行します。テストの実行に問題が無く、:rescuableの仕様で支障が無い場合はこれでOKです。

設定で:rescuableを選択してテストを実行するとエラーが出るようになってしまった場合は、テストを修正するか、:rescuable以外の設定値にします。元々trueと設定していた場合には:allfalseと設定していた場合には:noneへと設定し直せば、以前の挙動と同じになり、エラーは出なくなるはずです。

より詳しい情報を紹介している記事

本件の背景やテストの修正方法など、より詳しい情報はこちらの記事をご覧下さい。

0
Raw
https://www.techtips.page/ja/comments/223