RailsGirls Online More!に参加しました!
6月27日(土)にRailsGirls Tokyo, Nagoya, Nagano, Sendai合同で開催されたOnline More!(以下RGMore)に参加させていただきました!
【目次】
当日について
SpatialChatを使い、座学エリア・もくもくエリア・雑談エリアに分かれて各自好きなことを行うスタイルでした。
私は、座学エリアにて『Ruby超入門』の著者で、現在Fjord bootcampでアドバイザー(7/1より技術顧問)の Kuniaki Igarashi さんによるRuby・Rails・学習ガイドのお話を聞かせていただきました!
Railsのお話
Rails6.0から追加されたActionText機能について、実践を交えながら紹介いただきました。
ActionText
Railsにリッチテキストコンテンツと編集機能が追加できます。
コードをほとんど書かずにWordのような機能を実現でき、画像はドラック&ドロップで貼り付けられるので、例えばTwitterから画像を貼ったりすることもできました。
またリサイズも自動で行ってくれます。
私も作ってみました👇
写真はアルバニアに旅をした時のものです。
(日本人の99%は行かないって言われているマイナーな国です。。)
Contentあたりを見るとわかるように、ちょっとした字体の調整だったり、引用だったり目次だったりを表示する機能がついています。
また右端の矢印で作業を戻したり進めたりできます。本当にWordみたい!
下の方が切れてしまっているのですが、完成したらページ下のcreate/updateボタンで完成。
このindexで見るとわかるように、さっき見切れていた写真がいい感じにリサイズされています! ちょっと手を加えれば簡単なブログのようなものも作れちゃいそうです✨
その他注意点など
モデルはmessage.rbだが、テーブルは
action_text_rich_texts
で、record_typeとrecord_idでポリモーフィック関連になっているのでN+1問題を考慮する必要があるその他
active_storage_blobs
とactive_storage_attachments
のテーブルもあり、これらはActive Storageに関するもの。
画像やファイル名は、active_storage_blobs
に保存されているN+1問題への対応として
with_rich_text_#{name}_and_embeds
メソッドを使う場合、action_text_rich_texts
とactive_storage_attachments
テーブルは取得するが、active_storage_blobs
は取得しない
【その他参考】
Rubyのお話
リファレンスマニュアルを利用して、ArrayとEnumerableのメソッドを見ていきました。
その中でいくつか気になったメソッドをまとめてみました👇
Array
self * sep -> String
Array#joinと同じような動きができます。
p [1,2,3] * "," # => "1,2,3"
bsearch { |x| ... } -> object | nil
条件を満たす値を二分探索するので、検索が遅いarrayを速く処理できます。
(利用する場合、事前にソートしておく必要があります)
ary = [0, 4, 7, 10, 12] ary.bsearch {|x| x >= 6 } # => 7 ary.bsearch {|x| x >= 100 } # => nil
cycle(n=nil) {|obj| block } -> nil
配列の全要素を n 回(nilの場合は無限に)繰り返し、ブロックを呼びだします。
a = ["a", "b", "c"] a.cycle {|x| puts x } # print, a, b, c, a, b, c,.. forever.
combination(n) {|c| block } -> Array
サイズ n の組み合わせをすべて生成し、それを引数としてブロックを実行します。
順序の指定はできません。
a = [1, 2, 3, 4] a.combination(3).to_a #=> [[1,2,3],[1,2,4],[1,3,4],[2,3,4]]
concat(*other_arrays) -> self
自身の末尾に破壊的に連結します。 破壊的ではあるが、「!」が付かない。
[ "a", "b" ].concat( ["c", "d"] ) #=> [ "a", "b", "c", "d" ] [ "a" ].concat( ["b"], ["c", "d"] ) #=> [ "a", "b", "c", "d" ] a = [ 1, 2 ] a.concat(a, a) #=> [1, 2, 1, 2, 1, 2]
intersection(*other_arrays) -> Array
共通要素を新しい配列として返します。
[1, 1, 3, 5].intersection([3, 2, 1]) # => [1, 3] ["a", "b", "z"].intersection(["a", "b", "c"], ["b"]) # => ["b"]
Enumerable
まずEnumerableモジュール・Enumeratorとは
「Enumerableモジュール」は繰り返しを行なうクラスのための Mix-in
「Enumeratorクラス」は(each以外のメソッドにも) Enumerableの機能を提供する
「Enumeratorオブジェクト」はeachなどの繰り返し処理を行うメソッドのブロックを省略した場合に(も)返ってくる
Enumerableをincludeしてeachを用いることで、Arrayのメソッドが大体使えるようになります。
【6/30追記】
上記に関して、FBをigaigaさんにいただきました! 🙏
大筋あってるので細かいのですが、詳しく書くとこんな感じです
・eachメソッドを定義してあるクラスにEnumerableモジュールをincludeできる
・includeするとEnumerableに定義されてあるメソッドが全部つかえるようになる
・Arrayは最初からEnumerableがinclude済み(なのでEnumerableのメソッド群もつかえる)
chunk {|elt| ... } -> Enumerator
条件にそうもの、そわないものを分ける時などに便利です。
(even?
は偶数であれば真を、そうでない場合は偽を返す)
enum.chunk {|elt| key }.each {|key, ary| do_something } # 整数列を連続する奇数/偶数に分ける [3,4, 1, 5,].chunk {|n| n.even? }.each {|even, ary| p [even, ary] } # => [false, [3]] # [true, [4]] # [false, [1, 5]]
detect(ifnone = nil) -> Enumerator
find
と同じだが、Railsのfindと被ってしまうため、代わりにこちらを使う。
[1, 2, 3, 4, 5].detect {|i| i % 3 == 0 } # => 3
tally -> Hash
self に含まれる要素を数え上げた結果を Hash で返します。
["a", "b", "c", "b"].tally #=> {"a"=>1, "b"=>2, "c"=>1}
学習ガイド
RubyとRailsの学習ガイド2019年版をもとにお話いただきました。
その中でも「Railsの技術を伸ばしていくときにお勧め」として挙げられていた『パーフェクト Ruby on Rails 』は中級者向けとのことなので、勉強が進んだら読んでみたいと思いました。
もうすぐ発売される『パーフェクト Ruby on Rails 【改訂2版】』では、igaigaさんも執筆されていたそうでこちらも気になります!
またHTTPのおすすめ文献『暗号技術入門』も読んでみたいなと思いました。
【6/30追記】
igaigaさんより🙏
「HTTPでも使われている暗号技術を解説した本」という感じです。一言だと「暗号技術の本」ですね。めっちゃ良い本なのでお勧めです。
分野別でレベルごとに読むべき技術書を書いてくださっているので、ぜひこれからの学習の際にも参考にさせていただきたいと思いました。
感想
RGMore!あっという間の3時間でした。私がいつも参加させていただいているNagoya,NaganoのMore!は、主に本をみんなで読み進めるスタイルの勉強会なので、今回igaigaさんがお話してくださった座学形式の勉強会は新鮮でした。
中でもやはりRailsのActionTextは便利なのに一瞬で実現できてしまい、改めてRailsの面白さを感じられた気がします!
そして、普段中々お会いできない全国のRGさんたちと交流できたことも、とても嬉しかったです! 第2回があればぜひまた参加したい😆
今回このような場を用意してくださったRailsGirlsJPの皆さま、貴重なお話を聞かせてくださったigaigaさん、そしてRGのみなさん、ありがとうございました🤲✨🌼