【Ruby】JSON.loadで変換後、キーをシンボルにしたい!

JSON.loadJSON文字列をRubyのオブジェクトにしたいとき、ちょっぴりつまづいたのでメモ

以下はJSON文字列をloadしてRubyのオブジェクトに変換するコード例

 str=<<JSON
    { "a":1, "b":2, "c":3 }
    JSON
    
    JSON.load(str) # => {"a"=>1, "b"=>2, "c"=>3} # 普通に渡すとキーが文字列になる

↑を:a のようにキーをシンボルにしたい

ということでるりまを見ると、キーをシンボルにするオブションがあった。以下抜粋して引用。

docs.ruby-lang.org

:symbolize_names

真を指定するとハッシュのキーを文字列ではなくシンボルにします。デフォルトは偽です。

お、ということは、:symbolize_namestrueにすれば良い?? やってみた💪🏻

JSON.load(str, symbolize_names: true) # => {"a"=>1, "b"=>2, "c"=>3}  

# おっと変わらないぞ?

あれ、変わらない。

もう一度るりまを見たら

load(source, proc = nil, options = {}) -> object

どうやらprocとoptionsはデフォルト引数になっているらしい。

と、いうことはoptions(今回で言えばsymbolize_names)のデフォルトを書き換えたい場合は、その前の 第二引数でprocについて指定してあげないといけないのかなと思い、やってみる

 JSON.load(str, nil, symbolize_names: true) # 第二引数のproc部分をnilにした

 # => (省略)`initialize': options :symbolize_names and :create_additions cannot be  used in conjunction (ArgumentError) (省略)

なんかエラー出た!!

DeepL先生によると

initialize': オプション :symbolize_names と :create_additions は同時に使用できません (ArgumentError)

らしい。なんのこっちゃ🤔という感じなのでもう一度るりまを見る。

お、それっぽい記述があった!

:create_additions

偽を指定するとマッチするクラスや JSON.create_id が見つかっても付加情報を生成しません。デフォルトは真です。

「「「デフォルトは真。」」」

そして先ほどのエラー文訳、initialize': オプション :symbolize_names と :create_additions は同時に使用できません

ということは、:symbolize_names:create_additionsを今回どちらも真にしてしまったのがよくなかったらしい。

再チャレンジ!

 JSON.load(str, nil, symbolize_names: true, create_additions: false)

 # => {:a=>1, :b=>2, :c=>3} # できた〜!

結論

JSON.loadでキーをシンボルにしたいときは

symbolize_names: trueとともに、

  • 第二引数にprocについてを渡す(今回はnil

  • :create_additions:symbolize_namesと共存できない(どちらもtrueはできない)

  • そのため、create_additions: falseも記述する

ちなみにJSON.parseの場合

docs.ruby-lang.org

parse(source, options = {}) -> objectかつ

:create_additionsがデフォルトでfalse

なので、第二引数にsymbolize_names: trueを記述するだけでキーをシンボルにできる

 JSON.parse('[1,2,{"name":"tanaka","age":19}]', symbolize_names: true)

    # => [1, 2, {:name=>"tanaka", :age=>19}] 

JSON.loadJSON.parseは引数の書き方が違うということがわかった。

&無事キーをシンボルにできたのでヨシ☺️☺️!

もうすぐ2021年が終わると書いていたけど気づいたらもう終わってました。

2021年、私が本格的にプログラミング学習を始めた年。せっかくなので振り返ろうと思います。最後に2022年の抱負も。

2021年まとめ、振り返って思うこと

  • プログラミング学習を始めた
  • フィヨルドブートキャンプに入会した
  • そこで輪読会に参加したら仲間ができた

学習開始当初は、何のことやらそれはどこがどう面白いの?と思っていたような話題(この機能はRubyのバージョン2.7から導入されたんだ!みたいなやつ)も、輪読会で話すようになったら興味を持つようになって、面白い、もっと知りたいと思うようになった。

私は結構極端な人間で、得意と不得意、興味の有無がはっきり分かれているタイプというのは自覚していたけど、コミュニティに自分が影響されて、興味のなかったことに対して興味が持てるようになるというのは新しい発見だった。

  • 新潟に3ヶ月だけ住んだ

ずっと、東京近辺にしか住みたくないと思っていたので行くのはかなり嫌だったけど、住めば都とはよく言ったもので今でも新潟戻りたいな〜と思うくらいには好きな土地になった。

この影響でゆくゆくは地方で暮らしたいと思うようになった。広い家も建てられるし、場所を選べば美味しい食材が安くスーパーに売っていたり、都会より空が広く見えて空気が綺麗で良い。地方移住実現したいな〜

  • 「頑張ります」と言わない

私の母が、「『頑張ります』て面接でいう人ってやる気があるように見えて何故かすぐ辞めてくのよね。言わない人の方がやめない気がする。」と言っているのを聞いてから、なんとなくだけど極力頑張りますを言わないようにしていた。そうすると、ちょっとした文の締めとかで頑張りますを頻発していたことに気づいた。言わないのってなかなか難しいけど、そのおかげかFBC卒業も見えてきているから、頑張りますを無闇に言うのってよくないのかも知れない(関係ないかも知れないけど)

  • 自分の良かれが人にとって同じかどうかはわからない

新潟から東京に戻ってきた時、家族友人みんなに口を揃えて「よかったね!」と言われたのが忘れられなくて。私は正直東京より新潟の方が住み心地が良くて大好きな土地だから、そう言われるたびに「何も知らないくせに!!」と思ってた。もういい大人なのに。笑 でも、きっと自分も他の誰かに大なり小なりこういうことを言ってしまっているんだろうなと思った。

まとめ方が難しいけど、自分の良かれを人に押し付けないようにしたい。私の例で言えば、「東京に帰ってきた感想は?」とかから会話を始めたい。そうしたら「みんなに会える東京に帰って来れたのは嬉しいけど、新潟もう少し楽しみたかったな」くらいのことは言えたはず。ここであの時の気持ちを供養。

細かく振り返る

1月

3月に仕事を退職予定。某転職補償付きプログラミングスクールへの入会を予定していたものの、なんとなく胡散臭いビジネスみを感じてしまい悩む。

今年度いっぱいで仕事をやめるのにその後の行き場がなくなりそうで病む。個人でメンターをつけるなど検討するが1人で勉強するのは続かないのではと心配になる。

2月

血迷った私はなぜかプログラミングではなくお金の勉強をする。(完全に現実逃避)

そこでとある人のYouTubeを見まくる。その動画内で何やらフィヨルドブートキャンプというプログラミングスクールが良いらしいと言っているのを聞き、そこで初めてFBCを知る。

調べたら当時の職場の近くにオフィスがあり、なんとなく運命を感じる。月3万円というのも良心的。卒業に勉強時間1000時間前後かかるのはネックだが1日8時間毎日勉強すれば半年で卒業できるじゃんと思い入会を決める(※入会してすぐにそれは無理だと悟る)

3月

なぜかHTMLとCSSの勉強をする(今考えると謎)

仕事が忙しい。引き継ぎ、新年度に向けてなど。

プライベートでも引越しを控えていて死ぬほど断捨離する。正直あまり記憶にないが仕事をやめる寂しさと開放感にあふれていた。

たまにFBCのホームページを見ては「ここで大丈夫だよね、、?」と自問自答する。でも他に信頼できそうなスクールがわからないので覚悟を決める。

4月

東京から新潟に引っ越す。最初思いっきりホームシックをかます。でも1週間で慣れる。

中旬にFBC入会。新生活・自由な生活という名の無職に浮かれて毎日フルメイクに完璧なヘアセットをして、家から歩いて30分かかるコメダ珈琲に通って勉強する(今思うと謎)。

当時はプログラミング関係の勉強が楽しい〜!と思っていたが、今考えると新しいことをしてる自分を楽しんでいたのだと思う。

正直よくわかっていないけどなんだか前に進んでいる感がすごかった。

5月

住んでいた家(※元々彼がずっと住んでいたところに居候)に老朽化の影響で問題発生。あまりブログに書くような内容ではないので省略するがとある問題に悩まされて彼と2人でメンタルが死ぬ。(興味がある方は私まで)

中旬からは免許合宿のため2週間福島に行く。

ほぼ勉強の記憶はないがプラクティスはなんとなく進んでいる状態。

6月

免許合宿から帰ってくる。上記の家問題が解決しないので、同じマンション内で引っ越す。私引越ししすぎじゃん〜!と笑う。でも家の問題が解決して快適。

新潟に慣れてくる。相変わらずコメダに通う。FBCのプラクティスに慣れてくる。この頃は確かRubyのプラクティスをやってた。あまり記憶にないけど難しい、でも面白い、でも内心よくわからないまま進めていた。

FBCのDiscordで開催されている輪読会というのが気になる。でも参加する勇気がない、でも、気になる、のループをまわす。

6月中旬あたりに彼の東京への異動が発表される。しかも7月初日から。

いや今月引越したばっかり!!!なんなら私4月に新潟きたばっかだわ!!!と思いながら荷造りする。2021年上半期の私は荷造りばっかりしてる。

7月

新居に引越しできるのが中旬なのでその間自分の実家にお世話になる。

ハロワの関係で一旦実家に住民票を移す。(この行動のせいで後に選挙権を失う)

新居の周りは何もないけど自治体的にも私的にも大都会。新潟との諸々の違いに病む(※新潟県民歴わずか3ヶ月)

新潟シックをこじらせて外出できなくなる。もちろん勉強もほぼ進まない。それにどんどん勉強が難しくなる。 この頃がなんだか一番辛かった。

けど、友達からは「東京戻って来れてよかったね!」と言われる。私は新潟の澄んだ空気と広くて綺麗な空が好きだったんだよ!!!!と心の中でこっそり思う(※新潟県民歴わずか3ヶ月)

8月

悩んでいても仕方ないのでもうちょっと学習を頑張ってみようと思い直す。

FBCに知り合いが欲しいと思い始める。そして初めてのLT会に参加。今後どんなLT会があったとしても、私はこのときのLT会のことを絶対に忘れない。

東京に慣れてくる(※生まれも育ちも東京)

Ruby超入門から始まってチェリー本を読み切ろう!という輪読会に参加。

確かその当時はSinatraRailsのプラクティスをやってた。

9月

輪読会でのRuby超入門が9月下旬に終了する。

参加している人のレベルを知って、自分がいかにRubyをわかっていないか思い知る。

輪読会でコードの読み下しの文化に出会う。(声に出してサンプルコードの処理の流れを説明するやつ) そして読み下しをすると、自分が全然コードが読めてないことがわかる。 悔しい、というよりは皆と同じレベルで会話できたら楽しいだろうなと思う。

1人でも超入門を読んで、練習問題を何周かしたような。 でも、Rubyを知ったらRailsがおもしろい。全部全部繋がってるのか!!とここで気づく。9月はずっとRailsをやってた。

10月

LT会に登壇する。5分間で何かを伝えるってすごく難しい。正直点数をつけるなら自分の中では25点くらい。 でも登壇したことに後悔はない、何でもそうだけど、やってみて初めてわかることがたくさんあったから。

Railsクリアからのテスト楽しい〜からのオブジェクト指向に苦しめられる。 でも10月くらいから、コードを書いていると時間がすぐ過ぎるというのを実感するようになった。

選挙があった。毎回真剣に考える派なのに、ここ数ヶ月で住民票をいろんな自治体に移しまくったせいで私には選挙権がなかった。

11月

オブジェクト指向クリアする。そうしたら次はJSが苦しい。 メモアプリできなくて辛い。やりたくなくて数日勉強しない日があった。 結論、急がば回れで基礎をやらないと言語を操ることはできないと知る。

メンターである伊藤さんの正規表現のQiita記事がきっかけで正規表現が好きになった。

正直プライベートの記憶はほぼないけど、非エンジニアの友人と長年お世話になっている美容師さんにフィヨルドの話をしたら、???という顔をされた挙句全く話が通じなくて、「私、なんか変わったんだな、、」と思って少し傷ついたことだけ覚えてる。

12月

Vue.jsも難しい。 チーム開発に突入する。

最近のことなのに記憶があまりない。

2022年の抱負、したいこと

  • 卒業して働く

エンジニアとしてどんな仕事がしたいかは正直自分の中でまだ定まっていなくて、まずは一人前になりたいというざっくりした感じになってしまうけど

前職を退職後もやっぱり子どもが好きなのと0~6歳の就学前の大事な時期をもっと豊かに過ごしてほしいという願いは変わらなくて、それに加えてもっと子育てしやすい社会になってほしいというのが私の学生時代からのやりたいことなので、こんな気持ちがどこかで生かせる仕事に携われたら本望だなと思っている!

その他したいこと

  • 好きな服を買って出かけたい

何だかうまく締まらないけど、いつもなら年末公開しなかったしもういいや…となるところをちゃんと書いて公開したので2022年は幸先が良いはず。

正規表現学習記録 grep egrep fgrep

読んでいた本に出てきたので整理

grepとは

'g'lobal 'r'egular 'e'xpression 'p'rint

つまり、全体から正規表現で一致したものを抽出するためのコマンド

grep 検索したい文字列 ファイル名

でファイル内検索ができる ちなみにファイル名の部分をディレクトリ名にすると、 「それはディレクトリだ!」とターミナルに怒られます(今さっき怒られた)

ディレクトリ内のファイルを検索したい時には ディレクトリ/*としましょう

egrepとは

'e'xtended grep つまりgrepの機能拡張版

orの機能を持つ|が使える 例)文字列'ruby' または'node'を探したい時

egrep 'ruby|node' ./* =>結果が返ってくる
grep 'ruby|node' ./* =>結果が返ってこない

grep -Eとほぼ同じ機能(-E, --extended-regexp

fgrepとは

入力された文字列そのままの検索が出来る

例えば、.正規表現では任意の一文字を表すが、fgrepの中では.をただの文字列‘ドット’として使うことができる

fgrep ('text.txt') hoge.txt => text.txtがあればそれのみを返す
grep ('text.txt') hoge.txt => text@txtも返すし、text:txtも返す

grep -Fとほぼ同じ機能(-F, --fixed-strings)

ちなみに参考にした記事を見たらもっと機能がありました…全部知りたいけど、果てしないので今日はここまで

参考

manpages.ubuntu.com

eng-entrance.com

私のコミュニティ参加のきっかけについて

f:id:napple29:20211205122437j:plain

初めまして、フィヨルドブートキャンプ34期生のはるなと申します。

この記事は、フィヨルドブートキャンプ Advent Calendar 2021 Part1の5日目の記事として書いています。

Part2もあります! フィヨルドブートキャンプ Advent Calendar 2021 Part2

この話について

私は今、同じフィヨルドブートキャンプに所属しているParuさん主催の輪読会に参加していて、もうすぐ4ヶ月が経ちます。 そこでいわゆる声馴染みもできて、勉強面でも精神面でも良いことづくめで、ありがたいことに毎日楽しく学習しています。

しかし、もともと私はオンラインでのコミュニケーションにものすごく苦手意識を持っていました。フィヨルド内に知り合いと呼べる存在もいなかったです。

今回は、そんな私がコミュニティに参加するようになったきっかけについて書こうと思います。

今、本当はもっと誰かとコミュニケーションが取りたいのに勇気が出ない…という人に、この文章が届いたら嬉しいです。

自己紹介

前職は看護師でした。(手術室看護師をした後、転職して保育園の看護師をしていました) フィヨルドに入るまでのプログラミング学習は、主にProgateやpaizaをやったり、簡単なコードの意味はわかっても何か作れるようなレベルではなく、本当にお遊び程度に嗜んでいました。

フィヨルドに入ってからのわたし

今年3月に退職し、4月からフィヨルドに入会しました。

初めてDiscordに入った時は情報量の多さに目が回りました。全ての人がすごい人に見えて、私はここに馴染むことができるのかな…と心配になったことを今でも覚えています。

今となってはフィヨルドに馴染むというのはなんだかしっくり来ず、色々と参加している人が側から見ると馴染んでいるように見えるだけなのでは、と思います。 しかし、当時の私はオンラインでのコミュニケーションのハードルを乗り越えられず、何のイベントにも参加できませんでした。

以下、各イベントに抱いていた私の感情です。

ミートアップ

→オンライン上で会ったこともない人と話すなんて恥ずかしい

会社説明会

→説明会は聞いたが、その後のフリートークでどの席に移動したら良いかわからない。 もう話が盛り上がっているところに入っていけない(そして数分のひとりぼっち虚無を過ごし、そそくさと退散)

雑談タイム

→ラジオで数回参加。質問したくても声出すのが恥ずかしい

輪読会

→これに出たら知り合いが増えて良さそう。でも、すでに出来上がっているコミュニティに突然入っていく勇気がない(楽しそうだなと思いながら外から眺める)

という、典型的な(?)オンラインコミュニケーションのハードルを乗り越えられないタイプの人間でした。 オフラインでは人と話すことは好きです。なのでコミュニティに入りたい気持ちはかなり強かったと思います。でも、いざとなると恥ずかしくて無理!でも、誰かと繋がりたい、、、、の無限ループを繰り返していました。

入会から3ヶ月くらい(今年7月くらい)

フィヨルドでプラクティスを進めていくうちに、自分の進捗が思ったように進んでいないことから今後への不安が爆発し、色々な考えが頭をよぎります。

  • わかることは増えてきた、でも、圧倒的にわからないことが増えてきた

  • 冷静にこのまま一人で勉強するの、結構無理じゃない…?

  • せめて、質問タイムで質問できるようにならないと今後詰むのでは…?

  • こんなにわからないのって私だけかも、プログラミング向いてないのかも

また、先の開発プラクティスでは他の受講生さんとやりとりが発生することを考えると

  • ただでさえ勉強で精一杯になりそうなのに、そこに新しく出会う人とのやりとりが入ってきたらキャパオーバーするのでは…

  • そもそもこのままだといつ開発プラクティスいけるんだ…?(卒業なんて夢のまた夢…)

そんなふうに悩んでいたとき、タイミングよく初めてのLT会vol.8の告知がありました。

せめて、'あの時お話しましたよね…!'くらいの相手がまずは欲しいなと思い、

とりあえず参加して、フリートークでカメラオンにして一言だけでも声を出す

という小さな目標を立て、登壇者でもないのにすごく緊張しながらLT会に参加しました。

他の受講生さんのLTに想像を超える感銘を受けた

私が初めてのLT会に参加したのは、上述した通り、フリートークで顔を出して話すことが一番の理由でした。 そのため、LTに対しては純粋に、'どんな話をするんだろうな〜'という気持ちで参加していました、が、

もう見出し通りなんですが、お話されている内容にすごく感銘を受けたことを今でも覚えています。

他の受講生さんも【不安な気持ちを持っている】【他の人がすごく良く見えてしまう】という感情を持っているのか!!!私だけじゃないんだ!! と知ったのはこの時のLT会がきっかけでした。

ラクティスが難しいのも私だけじゃないし、最初からできないのも私だけじゃない、と知ったのもこの時です。 今までほぼコミュニティ参加をしていなかったので、他の方が考えていることを全然知らなかったんだなと思いました。 ここで話を聞けたことでかなり自分のモチベーション回復につながりました。本当にすごく良い会。

フリートーク

そして私にとっての本番(?)の時間

まず最初、Remoで安定の一人ぼっちになりました。普段の私ならここで退散しますが、 今日の私には目標が…😭と自分を奮い立たせ、せっかくなら登壇者さんがいるテーブルに行って、LTに感動したこと伝えよう!と思い席を移動してみました。

なんとかやっとの思いで、本当に一言だけ『すごく共感しました』的なことを緊張しながら言ったのを覚えています。

本当は、その時ご一緒した登壇者の方お一人お一人に伝えたいことがたくさんあったのですが、オンラインコミュニケーション初心者だったのでさらっと一言しか言えなかったのが心残りでした…

初めてのLT会はコミュニティ参加の第一歩に良いのでは?

初対面の人とのオンラインコミュニケーションに私が恐怖を感じていたのは、

「相手がどんな人かわからない」&&「何を話したら良いかわからない」

の二つが大きな理由だったと思います。

でもなんと!!!LT会後のフリートークってそれが少し解消されるんです!!

なぜかというと、

①LTをするとき、登壇者とオーガナイザーは画面に顔が出る

②LT登壇者の席に行けば、その人に【感想を伝える】という話題ができる

前回のLTに登壇した経験から言うと、自分のLTについて感想を伝えてもらえるってすごく嬉しいです。 なので、今まで関わったことないし…みたいなことは考えなくて良いと思います。

また、たとえ誰に感想を伝えられなくても、LT会自体が刺激をもらえるのでおすすめです!

次のLT会に出たい!と思うようになった

その時のフリートーク中に、LT出ないんですか?と私に声をかけてくれた方がいて、「え!こんな私でも登壇して良いような会なの?」と衝撃を受けたことを覚えています。 そこから、次のLT会に挑戦してみたい!と思うようになりました。

そして、LT会に出るならちゃんと知り合いといえる存在がいた方が心強くて良いなと思うようになり、 次良さそうな輪読会が始まるなら参加したい!と思い、 実際にそんな輪読会が開催され、そこに参加しました。(本当にParuさんに感謝…)

そして実際にLT会にも登壇しました!

'あの時お話しましたよね'という相手が欲しくて一歩踏み出したら、なんだか一気に世界が広がりました。

でも、この辺りは私が頑張ったというよりは、完全に運が良かったのと、人に恵まれたおかげです。心の底から感謝しています。

余談

ここまで書いていてこんなこと言うのもなんですが、決してコミュニティ参加をすること=最良だと思ってはいません。 正直なところ、自分のペースが一番大事だと思っています。

でも、一人で勉強するのって結構辛いですよね。私は辛かったです。単純に学習自体が難しいですし、それ以上に'プラクティスの進め方こんな感じでいいのかな'とか、'このままで卒業できるのかな'とか、'声をあげるほどではないけど抱えているちょっとしたモヤモヤ'は、一人ではなんとかならないですよね。

ちょっとしたことを気軽に共有できる相手がいるだけで気が楽になって、結果的に私は悩みが減って学習効率が上がった気がします。

また、少しずつ自分がコミュニティに参加していくと、自分が思っているほど相手は自分のことを気にしていないという事実に気づきました。 うまく喋れなくても、私のように最初にかなり緊張した経験がある人には、緊張するのわかる〜〜と共感してもらえるはずです。 とにかく、勇気を出して一歩踏み出してみて、悪い方向に進むことはないと思います。

まとめ

私の以前の認識は、コミュニティに参加する=そのコミュニティに自分を寄せていく・そこの空気感に合わせていくことだと感じていました。 しかし、実際に参加してみると、馴染むというよりは、とにかく参加するか・しないか、ただそれだけなんだなと気づきました。

きっかけはどこにでも転がっているので、誰かと繋がりたいな〜と思ったらそれがタイミングだと思います。 ただ、ちょうど良いことに12/18(土)は初めてのLT会vol.10ですね!!!勝手に告知!笑

長くなりましたが、5日目の記事はこれで終わりです!

明日の6日目はトミーさんです☺️

i18n訂正バージョン

前回ブログでまとめていたけど、レビュー後に追記 レビューで指摘されたこと

  • flashメッセージの翻訳忘れ  同じような文章は変数を使う

  • submitボタンの翻訳忘れ  今回で言うと、f:id:napple29:20210902150110p:plainのようなUpdate 本が出来上がってしまっていた。。  ここは一番ハマった。辞書の中のhelpersが勝手に変換してくれる。view側では何もしない。(submitボタンのあるHTMLテンプレートにあれこれしたり、grepでUpdate 本って調べまくった。恥ずかしいい)

  • モデルの属性はhuman_attribute_nameを使う  モデルの属性、いわゆるデータとして保存されるカラムたちはActiveRecordを使う  Railsガイドの4-5に載ってるのでわからなくなったら見る

  • lazy lookup機能を使う Railsガイドより

Railsには、 ビュー 内部でロケールを参照するときに便利な方法が実装されています。以下のような辞書があるとします。

es:
  books:
    index:
      title: "Título"
以下のようにして、app/views/books/index.html.erbビューテンプレート 内部 でbooks.index.title値にアクセスできます。ドットが使われていることにご注目ください。

<%= t '.title' %>

ちなみにコントローラーでも使える。

en:
  books:
    create:
      success: Book created!
上は、たとえば次のようにflashメッセージを設定するのに便利です。

class BooksController < ApplicationController
  def create
    # ...
    redirect_to books_url, notice: t('.success')
  end
end

t('view.hoge')ってするより便利だし、辞書が見やすくなる〜

このサイトかなり参考にした! pikawaka.com

kaminariでページング

kaminariとは

rubyのgemの一つでページネーションを簡単に実装するためのもの

参考にさせていただいた記事

qiita.com

qiita.com

qiita.com

qiita.com

やったこと

kaminariをインストール

$ gem install kaminari

$ vi Gemfile

gem 'kaminari'

$ bundle install

kaminariの設定ファイルを作る

$ rails g kaminari:config create config/initializers/kaminari_config.rb 上記コマンドにより、config/initializers ディレクトリ直下に、以下の設定ファイルが生成される。

$ vi config/initializers/kaminari_config.rb

# frozen_string_literal: true

Kaminari.configure do |config|
  # config.default_per_page = 25
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  # config.left = 0
  # config.right = 0
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
end

使いたい機能の部分のコメントアウトを外すと、自分でいろいろ設定できる☺️

ちなみに、カスタマイズしたコードは、以下の通り。 (※設定ファイルはinitializers配下に存在するファイルのため、rails sを実行してカスタマイズ内容を読み込む必要があることに注意!)

$vi config/initializers/kaminari_config.rb

# frozen_string_literal: true

Kaminari.configure do |config|
  config.default_per_page = 20
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  config.left = 2
  config.right = 1
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
end

コントローラーに以下を記述

def hoge
  @users = User.page(params[:page]).per(10)
end

hoge→使いたいページ名、viewの中の使いたいhtmlのタイトルに合わせた気がするけど、私の時は確かindexだったかな

@users→任意の変数でOK

User→使いたいデータに合わせる

ここで、よくわかっていなくて意味のわからないところにコピペしたメソッド置いてエラー出たけど冷静になって解決。

def index
~~~
end

def page
  @page= Pages.page(params[:page])
end

みたいに、どこかから引っ張ってきたメソッドをただコピペしてた…😂

使いたいviewのHTMLファイルに以下を置く

次に、viewでページネーションを表示させたいところに<%= paginate @posts %>を追加。

' $ vi app/views/posts/index.html.erb'

<%= paginate @posts %>

日本語化 もうi18nの設定が終わっていたので、今回はja.ymlファイルに以下を追加するのみ

ja:
  views:
    pagination:
      first: 最初
      last: 最後
      previous: 前
      next: 次

その他、したこと

  • 並び順が一意になるorderを設定

コントローラーの方に

@page= Pages.page.order(params[:page])

みたくした気がする

こう書いてみるとまだわからないことたくさんあるな…まあいいか

以上!備忘録でした〜🌈

Railsのi18n対応

i18nとは

Internationalization、日本語で言う国際化のこと iとnの間が18文字だからこう言うそう。

参考にさせていただいた記事

qiita.com

qiita.com

alfa.hatenablog.jp

rails3try.blogspot.com

実際にやったこと

1 デフォルトの言語を日本語に設定する config/application.rbを下記のようにする

require_relative 'boot'
require 'rails/all'

Bundler.require(*Rails.groups)

module BoardApp
  class Application < Rails::Application
    config.time_zone = 'Tokyo' ★
    config.active_record.default_timezone = :local

 # アプリケーションが対応している言語のホワイトリスト(ja = 日本語, en = 英語)
    config.i18n.available_locales = %i(ja en)

   # 言語ファイルを階層ごとに設定するための記述 ※
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s] 

  # 上記の対応言語以外の言語が指定された場合、エラーとするかの設定(今回は書かなかった)
    config.i18n.enforce_available_locales = true

    # 以下の記述を追記する(設定必須)
    # デフォルトのlocaleを日本語(:ja)にする
    config.i18n.default_locale = :ja

  end
end
  • コメントアウトになっている部分を#消して有効にした。
  • ★部分…これ記述したらrails sでエラーになりました。確かTOKYOにする前はデフォルトでカナダ?とかになってた気がする。消しても問題なかったですが、コメントアウトがいいかなと思います。

2 gem 'rails-i18n'をインストール $ gem install rails-i18n

Gemfileに以下を記述

gem 'rails-i18n'

$ bundle install

3 辞書になるファイルを作成する config/localesに多言語設定ファイル(*.yml)を配置する。

locales

├── en.yml

├── ja.yml

└── translation_ja.yml

モデルごとに置くこともできるみたいだけど、よくわからず一個だけ置きました😇 中身はこんな感じ(ja.yml)

ja:
 view: 
    name: '名前'
    age: '年齢'
  

en.ymlはこれの英語バージョン

4 HTMLに埋め込む t('view.name')

完成🥰

5 動的に切り替える controller/application_controller.rbに以下を設定

class ApplicationController < ActionController::Base

    before_action :set_locale

    def set_locale
        I18n.locale = locale
    end

    def locale
        @locale ||= params[:locale] ||= I18n.default_locale
    end

    def default_url_options(options={})
        options.merge(locale: locale)
    end
end

上記設定を入れることで、localeを動的に変更します。

config/routes.rbに以下を追記

Rails.application.routes.draw do
  scope '(:locale)', locale: /#{I18n.available_locales.map(&:to_s).join('|')}/ do
    # For details on the DSL available within this file, see 
    resources :resource_As
  end
end

動的多言語対応するアクションをscopeで囲むと[domain]/ja/hogehoge/といった記述で表示する言語をパラメタとしてアクションに渡すことができます。渡されたパラメタは、application_controller.rb内で、判断され、対応言語の場合はその言語で画面描画します。(あんまりよくわかってない)

以上!備忘録でした〜🌈