【初心者向け】チェックボックスの書き方あれこれ[Ruby][Rails]

やはりフォームの作成方法が難しいたぬきです。今回は、collection_check_boxというviewヘルパーの理解にかなり時間がかかったので、備忘も兼ねて整理してみようと思います。

check boxの書き方3つ

そもそも、チェックボックスの書き方なのですが、以下の3つの方法があり、それぞれ以下のように使い分けます。

  • check_box_tag(関連するモデルがないとき)
  • check_boxメソッド(関連するモデルがあるとき)
  • collection_check_boxes(多対多のリレーションのモデルを表現するときに便利)

check_box_tagの書き方

check_box_tagの書き方は以下の通りです。一緒に、ラベルも併記しています。 なお、以下、viewの情報はhamlで書きます。

=check_box_tag :check1
 =label_tag :check1, "ラベルのテスト"

実行結果は以下の通り。

Image from Gyazo

一つのチェックボックスができました。

check_box の書き方

check_boxの書き方は以下の通りです。

= check_box :group, :user_ids, {class: "check_box"}, true, false

リファレンスによると、

check_box(オブジェクト名, プロパティ名 [, オプション, checked_value = "1", unchecked_value = "0"])

という構造になっているようで

  • 第1引数(オブジェクト名)・・・データを保存したいモデル名
  • 第2引数(プロパティ名)・・・データを保村したいカラム名
  • 第3引数(オプション)・・・クラス名など。色々入ります。(詳しくはこちら
  • 第4引数、第5引数・・・まだ調べが足りていないのですが、チェックが入っている時のvalueを1にするか否か、チェックが入っていない時のvalueを0にするか否かの設定だと思います。

ちなみに、check_boxではなく、f.check_boxの形にすると(つまり、form_withやform_forの中で使うと、第1引数(オブジェクト)が省略できるようです。

form_withやform_forの中で、関連するモデルは定義していますものね。。。

labelの具体的な書き方は今回はわからなかったので、また後日実装の機会があれば加筆します!

collection_check_box の書き方

最後に、collection_check_boxを用いたチェックボックスの書き方です。またまた、理解が曖昧で申し訳ないのですが、こちらは多対多のリレーション構造の中でチェックボックスを利用するときに便利な書き方なのだそうです。

書き方は、こんな感じ

= collection_check_boxes :group, :user_ids, User.all, :id, :name do |user|
  = user.label { user.check_box + user.text }

書かれている内容の詳細な解説はこちらのページが詳しいです。 ▼collection_check_boxesメソッドの構造確認 https://qiita.com/sho012b/items/3a595fde14516081dff5

railsで多対多な関係を実装する時のポイント https://qiita.com/m-shin/items/0487105994d9281221d4

構造的には、このような形になっていて

collection_check_boxes(object, method, collection, value_method, text_method)

それぞれ、引数は以下のような意味を持ちます。

  • 第1引数:データを保存するテーブル
  • 第2引数:データを保存するカラム
  • 第3引数:ここで指定して持ってきているデータ(配列)の数だけ、チェックボックスが作成される
  • 第4引数:生成されるinputタグのvaule属性の値(下記参照)
  • 第5引数:生成されるinputタグのテキストとなる値(下記参照)

生成されたHTMLタグはこちら

<input type="checkbox" value="1" name="group[user_ids][]" id="group_user_ids_1">"ここに生成されたテキストが入ります"

check_boxと同様に、form_withなどの中でf.collection_check_boxesのような形で使うときには、第1引数が省略できます!

最後に、こちら2行目の部分ですが、

= collection_check_boxes :group, :user_ids, User.all, :id, :name do |user|
  = user.label { user.check_box + user.text }

Apiドキュメントによると、ラベルを生成するためのオプションだそうです。

(上記ドキュメントの下方に「The builder methods label and check_box also accept extra HTML options:」という記述があるので、そちらをみてください)

特に、check_boxの理解とcollection_check_boxの第2引数の理解が甘いですが、2ヶ月ほど前にはお手上げだったカリキュラムも何とか噛み砕いて理解できるようになりました。。。

formは特別な書き方が多く本当に難しいですね。いつかform周りで得た知識をまとめてみたいです。引き続き精進いたします。

就職決まりました!30代半ば、未経験者が内定をもらった時の知見まとめ

こんにちは、エンジニアとして就職を目指すタヌキです。 前回から間が空いてしまいました。。。

その間、個人で受けていたデザインの仕事が忙しかったり、ポートフォリオサイトに思いの外反響があったりで、忙しくしていました。

▼作成したポートフォリオサイトはこちら
Azumi's Portfolio Site

そして、ポートフォリオサイト公開から2週間経ったのですが、 その間、色々ありまして…。




…無事、内定を獲得できました!!!!

2日前に口頭で面接の通過をご連絡いただいて、
本日文章でも内定をいただいたので、 もう公表しても大丈夫だと思います。。。
結論から言うと、いわゆる求人媒体からの応募は一切せずに
全て友人から紹介いただいた会社と面談。

結果、
オファー3件に対し、
内定1件、
辞退2件

…と、かなり強気な就活の結果となりました。

同じ30代の就活仲間たちが数十社単位で応募をしていた中、 かなり特殊な結果となったと思うので、知見をまとめておこうと思います。

同じ30代の方々の参考になれば幸いです。





友達の紹介経由でしか企業に応募しなかった、その理由

まず、冒頭にも書きましたが、私はいわゆる求人サイト等からの応募は一切せず、
全て友人・知人の紹介で企業とつながりました。

ポートフォリオサイトの公開後、SNSFacebook)で友人限定で
「仕事を探しています」
と希望条件を書いて、呼びかけました。

いわゆる一般の求人サイトでの応募をしなかった理由は、


  1. 行きたい業種がはっきりしていてた、しかもかなりニッチだった

  2. 一般の求人媒体に応募をするのが怖かったから

  3. 過去に友人経由での仕事獲得に成功したことがあったから
    の3点です。

    応募する分野にこだわりがあり、しかもニッチな分野だった

    私の就職における関心分野は「ITスキル講習を通じたキャリア支援」でした。 (しかも、できれば社会的にしんどい立場にある人に対しての支援、という条件付き)

    就活での一番のこだわりはこの部分(業種)だったので、応募できる会社も数社に限られていました。

    また、これまでの仕事も同じ業種だったので、同じ分野の知り合いも多く、 一般の求人媒体で職を探すよりも友人・知人 経由の方が良質な求人に出会えると思いました。

    一般の求人媒体に応募をするのが怖かった

    2つ目かつ最大の理由は、同年代の友人・知人が就活にとても苦労していたためです。

    自分より優秀な人でも、
    30代というだけで書類選考が通らなかったり、
    面談に行っても拒絶されてしまったり、
    そもそも就活系イベントに行けなかったり。。。

    私より2〜3歳年下の彼・彼女たちでそうなので、 自分ではもっと扱いがひどいだろうな〜…と思ったのが一般的な求人媒体での応募を敬遠してしまった理由です。

    今思うと、1社ぐらい応募して世間を知ってもよかったなあと思いますが、 とにかく、体力的にも気力的にも自分には辛いと思ったので避けました。^^;

    厳しい中で戦い続けた友人たちは本当にすごいと思います!!

    過去に、SNSで仕事をくださいと呼びかけて成功したことがあった

    あとは、過去にSNSで仕事(デザイン系の案件)をくださいと呼びかけたところ、 予想以上の案件をいただいてしまったことがあり、 SNS就活、ひょっとしたら私に向いているのかも??
    と自信があったというのもあります。

▼その時の状況はこちら
ありがたいことに、お仕事をぽろぽろいただいてしまった。いただけた背景の考察とまとめ。 - エンジニアとして修行を積むタヌキの日記

友人経由の就活でよかった点

友人経由の就活でよかった点は、以下の3点です。

  1. 自分の人となりをよく知っている人から紹介してもらえる

  2. 企業も人柄を見てくれる、経験を評価してくれる

  3. 友人も働いている会社という安心感

まず、自分の人となりをよく知っている友人から企業を紹介してもらえるので、 働き方だったり職種だったりで、 自分のことをよく考えて理解してくださっているなあというオファーが多かったです。

また、企業も自分に興味を持った状況で会ってくれるので きちんとポートフォリオを見てもらえたり、 人柄を見てもらえたり、 経験を生かした仕事を提案してもらえたり、 様々な質問もフランクにさせてもらえたりと、

かなり有利な状況で選考を進めていただいたような気がします。

また、友人も働いている会社ということで、 極端に悪い労働条件の企業ではないという安心感もありました。

友人経由の就活で苦労した点

逆に、苦労をした点は、以下の通りです。

  1. 興味がないオファーが来た時が辛い

  2. 選考を辞退する時が辛い

まず、友人とのおつきあいがあるため、 インターネット等で収集できる情報を見て興味が持てなくても、 会いに行って面談をする必要があると思います。

私の場合は、その結果とっても良い企業に出会えたりもしたのですが、 (ただし、その企業は内定した企業ではありません) 興味がなくてもそれを悟られず、相手を不快にさせないで、お互い気持ちよく面談を終わらせるのは結構高度な会話のテクニックが必要だったように思います…。

また、オファーを断るときはさらに話を落ち着かせるポイントが難しかったです…。 例えるなら、告白を受けた状態で、 「ありがとう。あなたの事は好きだけど、これからも良いお友達でいてくれたら嬉しいな」
というお断りを、大人の言葉で(ビジネスライクに)うま〜くしなければならないような状況になります。。。

過去にお付き合いが長く、大変良くしてくれた友人や企業であればあるほど、それが難しい。。。。
今回はとても話の運び方が苦しかったオファーがありました…。

反省点

今回の就活で反省点があったとすれば、「応募の順番を間違えた」ということがあるかもしれません。

今回、本当は自分の中で応募をしたい企業が他にあったのですが、 それらには1件も応募をしませんでした。

チャレンジをしなかったことで後悔が残らなかったといえばウソになるので、ダメ元でも応募をしてから、友人にオファーを募ればよかったのかもしれません。

また、SNSで不特定多数の人に「お仕事をください」と呼びかけたのもあまり良くなかったかもしれません。

その結果、ありがたいことでもあるのですが、予想以上のお声かけをいただいてしまい、お断りをしなければならないケースも出てきました。

結果、どんなところに就職をしたか

そうして、私が就職をしたのは、
「就労支援スタッフ 兼 エンジニア」
という形で働く会社でした。

私だけでなく全員が就労支援スタッフを兼任か専任なので、他のエンジニアの方も同じような形で働いています。

特に、今までの業務経験から「就労支援スタッフ」としては即戦力になるというのが、採用にあたっての大きなポイントになったと思います。

100%エンジニアとしてバリバリできる会社ではありませんが、
自分でも、就労支援員としてすぐに活躍できる場があるのは嬉しかったです。

職種は違えど同じ業種でチャレンジしようと思っていたのがプラスに働いたと思います。

30代の方は、自分の経験が何かプラスになる職場を選ぶと、若い方よりも有利になることがあるかもしれません。


友人経由の就職にトライしてみたい人へ

30代も半ばで、無事未経験職種に転職ができて、大変嬉しいです。
この幸運を大切に、早く社会に貢献できるタヌキになりたいです^^
紹介してくれた友人には感謝がつきません♪

今回、就活を通して自分が築いてきた人脈のありがたさを大変感じました。


私は29歳まで教員をやっていて、
それまでは狭い世界で生きていました。 そして、友人も少ないタヌキでした。

また、20代の自分はとてもコミュ障で人間関係にもすぐつまづいてしまっていました。

そんな私ですが、30になった頃から少しずつ自分を変えるべくトライをしてきて、数年でこんなに人に恵まれる状況にまでなれました。

もし、今これを読んでくださっている方が20代なら、ぜひ会社の外に出て、積極的に社外人脈の構築を試みることをお勧めしたいです。

転職をしなくても、人生が豊かになりますし、
数年後、新しいことにチャレンジしたくなったときには、友人経由で就職先など色々な社会資源にアプローチできるようになっているかもしれません。

それでは、ここまで読んでくださりありがとうございました。
勤務開始は8月から。それまでのんびり勉強を頑張ろうと思います
明日寒い日が続いていますが、皆様御自愛くださいませ…

ポートフォリオサイトを公開しました

こんにちは、エンジニアとして就職を目指しているタヌキです。

Qiitaとはてなブログの特徴の違いがよくわかっていなかったのですが、はてなブログは日記とか制作の記録など、Qiitaはより技術的なところに注力するといいよーとアドバイスをいただいたので、今後こちらには日記的な内容を主に書いていこうと思います。

Qiitaの方も同じアイコン、 @tanutanu という名前でやっていますので、よろしければご覧いただけると嬉しいです^^

▼Qiitaの記事一覧 tanutanu - Qiita

もちろん、「Qiitaに投稿しましたー!」という情報は、こちらでもまとめていければと思っています。

ポートフォリオサイトを公開しました

さて、先日私はポートフォリオサイトをいよいよ公開しました!

Azumi's Portfolio Site

こちらのおかげで3日間くらい無口になるぐらいしんどかったのですが、先日24日、ようやくできました…!

スクールで定められた締め切りから2週間超遅れ。。。 仕事の合間を縫って頑張りました!!

順調ではなかった制作

しかし、制作への道のりは全く順調ではなく。。。。 まず、デプロイにつまる。。。。

ポートフォリオに載せるはずの個人アプリを作ったところ。。。 デプロイできない。

AWSではなくHerokuに変えても、できない。

エラーなく最後までデプロイのファイルは向こう側に行くのに、表示されない。。。。

というトラブルに3日間ぐらい時間を取られ、

結果、動的だったポートフォリオサイトは8割型できていたのですが、静的サイトに書き直しました。

悔しいですが、就活の期限があるので、仕方ありません。 なんとか静的サイトで作り直しました。

静的サイトにも学ぶことが

でも、結論としてやってみてよかったです! 静的サイトも以前作ったのは5年以上前だったので、技術的に学ぶことがたくさんありました。

JS・CSSをwebpackでまとめる

まず、webpackの存在。

JSファイルとか、CSSとか、headerにまとめて書くのは大変だー>< と思っていたのですが、webpackを使うと、一つにまとめられるのですね!

ics.media

知ったタイミングが遅かったので、導入は次回からとなりそうですが、次回はきっと利用してみます。 あと、これで静的なサイトにもscssが使える様です!

cssだとネストの記述がなかなか記述が大変なところがあって、次回はこれでまとめてみようと思います。

テンプレートエンジン・インクルードという概念の存在

静的なサイトでHaml書けないのかー!しんどいー!と思っていたら、書けました^^

www.i-ryo.com

また、header、footerの中身も全ページに設定しなきゃダメなのかなー、しんどいー!と思っていたら、インクルードという概念があって、工夫によっては統合できそうです。

app.codegrid.net

今回、時間がなくてこれらは試せなかったのですが、時間があれば実験してみます。

JSONで動的サイトに作ってみた

最後に、動的なサイトを静的なサイトに書き直したため、ギャラリーの表示をどうしよう!!と思っていたのですが、

JSONで色々実験してみたら、動的サイト風に表示できました。 JavaScript(正確にはJQueryですが)を使いこなすと、できることが広がりそうですね!

▼作成したギャラリーページはこちら Image from Gyazo

これから、就職活動頑張ります!

最後に、このサイトをもってこれから就職活動を頑張ろうと思います♪

Wantedly登録情報も更新しましたので、合わせてご覧いただけると嬉しいです。

Wantedly https://www.wantedly.com/users/3373640

ポートフォリオサイト https://seinoazumi.github.io/portfolio/index.html

どうぞよろしくお願いいたします。 それでは、ここまで読んでくださり、ありがとうございました^^

【初心者向け】i18nを利用して、enumのf.selectオプションを日本語化する[Rails]

こんにちは、エンジニアとして就職を目指しています、タヌキです。 前回の記事では、haml, form_withを利用して、f.selectの入力フォームを作るために色々と試行錯誤した話、 さらに、enumを利用してデータを利用しやすくした話を書きました。

▼前回の記事はこちら

【初心者向け】form_with, haml, enumを使ってselectによるプルダウンリストを作った話[Rails] - エンジニアとして就職を目指すタヌキの日記

その中で、f.selectの入力フォームは実装できたのですが、 最後に選択肢が英語になってしまうという課題が残りました。

そのため、今回はenum利用時に、f.selectの選択肢を日本語にするための方法をご紹介したいと思います。 合わせて、日本語化したデータをビューなど他の場所でも使うための方法もご紹介いたします。 どうぞよろしくお願いいたします。

今回参考にした記事

まず、今回参考にさせていただいた記事はこちらです。 参考というよりも、こちらの記事がとても良すぎて、ほとんどこのままの内容で実装できましたので、 本記事の内容も下記の記事とほぼ同じです。

ページ下方の、selectオプション以外への使用方法の項だけ、内容が異なります。 自分自身のまとめのために、やったことを記しているので、 selectオプションへの使用方法だけが知りたい!という方は下記の記事を参照された方が良いと思います。

▼参考にした記事はこちら

i18n、enumを利用して、formforのf.selectを日本語化する - Qiita

必要なファイル

enumを日本語化する上で必要だったファイルは下記の通りです。

  • (gem) enum_help, rails-i18n
  • model ←今回は restaurant.rb
  • ja.yml
  • application.rb

その他、enumを日本語化して記載したいビューファイルです。

gem ファイルのインストール

まずは、enumI18n(国際化)対応させるgem enum_help をインストールします。

rails-i18nの方はまだしっかり言語化できていないのですが、 i18nの機能が使いやすくなるそうです。

#Gemfile

gem 'rails-i18n'
gem 'enum_help'

bundle lnstall します。

model に enumを記載する

次に、modelにenumを記載します。 今回は、レストラン情報を載せるrestaurantsテーブルの、昼の予算のカラム budget_d に対して、下記のようにenumを記載しました。

#models/restaurant.rb

enum budget_d: {
    default: 0,
    till_1000: 1,
    till_2000: 2,
    till_3000: 3,
    till_4000: 4,
    till_5000: 5,
    over_5000: 6
  },  _prefix: true

最後の prefix: true は、同じ値をもつ複数のenumが存在するときにつけるものです。 今回は、夜の予算を定義する budget_n も同じアプリ内に存在していたので、 prefix:true をつけました。

▼詳しくは、こちらをご覧ください。 Rails5 から enum 使う時は_prefix(接頭辞)_suffix(接尾辞)を使おう - Qiita

ja.ymlに翻訳情報を記載する

翻訳情報を記したファイル、ja.ymlを config/locales/ 内に作成し、下記のように記します。

# config/locales/ja.yml

ja:
  enums:
    restaurant:
      budget_d:
        default: "--"
        till_1000: "~¥999"
        till_2000: "¥1,000~¥1,999"
        till_3000: "¥2,000~¥2,999"
        till_4000: "¥3,000~¥3,999"
        till_5000: "¥4,000~¥4,999"
        over_5000: "¥5,000~"
      budget_n:
        default: "--"
        till_1000: "~¥999"
        till_2000: "¥1,000~¥1,999"
        till_3000: "¥2,000~¥2,999"
        till_4000: "¥3,000~¥3,999"
        till_5000: "¥4,000~¥4,999"
        over_5000: "¥5,000~"

上記は、enumのデータを翻訳したい時の記載方法ですので、その他の場所を翻訳したいときには、別の記載方法となります。

▼詳しくは、こちらの記事をご覧ください。 [初学者]Railsのi18nによる日本語化対応 - Qiita

デフォルトの言語を日本語化する

application.rb の設定を変更して、デフォルトの言語を日本語にします。

# config/application.rb

 #  前略

module SomeApp
  class Application < Rails::Application
    
    # 中略

    config.i18n.default_locale = :ja # デフォルトのlocaleを日本語(:ja)にする

 end
end

パスを通して、i18nロケールファイルが読み込まれるようにする。

以下の記述も application.rb に追記して、locales フォルダ内のファイルが全て読み込まれるようにします。

# config/application.rb

#  前略

module SomeApp
  class Application < Rails::Application
    
    # 中略

    config.i18n.default_locale = :ja
 config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s] # 追記

 end
end

これで、enumを日本語化するための設定は完了です! 設定だけでかなり長かったです・・・。

最終的なコード

そして、今回 f.select に使用したコードは下記のようになりました。

# viewfile

= f.select :budget_d, Restaurant.budget_ds_i18n.keys.map{|k| [I18n.t("enums.restaurant.budget_d.#{k}"), k]}

まず、budget_d の中身を含む配列、budget_ds に対し、 keys メソッドを実施し、[["default": "--"], ["till_1000": "~¥999"], ...] などのキーだけ(["default", "till_1000"])を配列の形で取り出します。

そして、その値一つ一つに対して、mapを使い処理をしています。

処理の内容は、 I18n.t ... enumの内容を翻訳するメソッド を使って、["翻訳した内容":"value"]の配列を作る処理です。

enums.restaurant.budget_d のように、 ja.ymlに書いたenumの翻訳情報の位置をきちんと記します。

結果

その結果、できたドロップダウンリストがこちら。

Image from Gyazo

生成されたコードがこちらです。

Image from Gyazo

valueがdefaultやtill_1000などになっていますが^^;これで正しくvalueはデータベースに保存されます。

その他の場所で、翻訳したデータを使う。

最後に、ビューのその他の場所で翻訳したファイルを使う方法をご紹介します。 基本的には、「カラム名_i18n」をつけた表記にすればokです。

# view

%p= restaurant.budget_d_i18n #これで、昼の予算が日本語で表示される

enumの日本語化といい、f.selectの表記といい、なかなか時間のかかった実装でした。 それでは、ここまで読んでくださり、ありがとうございました。

【初心者向け】form_with, haml, enumを使ってselectによるプルダウンリストを作った話[Rails]

はじめに

どうもこんにちは。エンジニア目指して修行中のタヌキです。

formって、viewとデータベースとの交差する点なので、色々と記述が難しいですよね。 今回は、selectによるプルダウンリストを実装するにあたり、色々と試行錯誤をしたので、自分自身の備忘のためにも記録を残しておこうと思います。

データベースとデータ型について

前提として、今、レストラン情報を登録する食べログのようなサイトを作っています。 テーブル名はrestaurantsです。

昼の予算、"budget_d"の項について、selectでオプションを選択できるようにしたいと思います。

まず、restautrantsテーブルにbudget_dカラムを作成し、そこにinteger型でデータを入れるようにします。

# migrationファイル

class AddColumnToRestaurant < ActiveRecord::Migration[5.2]
  def change
    add_column :restaurants, :budget_d, :integer, default: 0
  end
end

まずは基本のHTML

formタグの、selectタグを用いた基本のHTMLは、こんな形になります。

# view

<select name="budget_d">
  <option value="0">--</option>
  <option value="1">¥~999</option>
  <option value="2">¥1,000~¥1,999</option>
  <option value="3">¥2,000~¥2,999</option>
  <option value="4">¥3,000~</option>
</select>

それを、hamlで書いてみる

それを、 hamlで書くとこんな感じ。以下、hamlで記載していきます。

# view

%select{:name => "budget_d"}
            %option{:value => "0"}  --
            %option{:value => "1"}  ¥~999
            %option{:value => "2"} ¥1,000~¥1,999
            %option{:value => "3"} ¥2,000~¥2,999
            %option{:value => "4"} ¥3,000~

そして、form_with で書いてみる

そして、これをform_withを使って書くとこんな感じ。

# view

= form_with model: @restaurant, local: true do |f|
 = f.select :budget_d, [["--", 0],["¥~999", 1],["¥1,000~¥1,999", 2],["¥2,000~¥2,999",3],["¥3,000~",4]]

[["key", "value"], ["key", "value"]... ] と配列の左側にキー(オプションとして表示する値)が、右側にバリュー(データベースに送る値)表示され、プルダウンリストの選択肢となります。 シンプルな実装でよければ、これで選択した内容をデータベースに登録できます。

余談(1)

form_withはデフォルトでviewにJavaScriptを呼び出してしまうので、 HTMLを呼び出したい場合にはlocal: trueが必要だそうです。

余談(2)

クラス属性は第3引数でないと入れることができないので、もしselect_boxにクラスを指定したい時には、以下のように書きます。

= f.select :budget_d, [ ここに配列が入ります ], {}, {class: "クラス名"}

enumを使って、使いやすく

更にこれをenumを使って、使いやすく、メンテナンスしやすく書くとこんな感じになります。 enumを使うことで、if budget_d.default? などのメソッドも使えるようになります。

# view
= f.select :budget_d, options_for_select(Restaurant.budget_ds.keys)
#model

enum budget_d: {
    default: 0,
    till_1000: 1,
    till_2000: 2,
    till_3000: 3,
    over_3000: 4,
  },  _prefix: true

このとき、hamlの方で「budget_ds」と複数形になっているのがポイントです。 options_for_selectは配列を求めるメソッドなので複数形でないとうまく認識されません。

さて、これで無事プルダウンリストの中身が表示される(はず)...です。。。 ここまでのトライアンドエラー、色々長かったです。。。。。

enumの日本語化

がしかし、話はここでは終わらず。。。 実は、このままだとリストのオプションおよび諸々のビューでenumに設定した値が英語で表示されます。 (下図参照)

Image from Gyazo

そこでenumを日本語化する必要があるのですが。。。。ここで書くと非常に長文になってしまうため、それはまた回を改めてご紹介したいと思います。。。

formは何かと大変ですが、試行錯誤したおかげで少し好きになれました♪ 最後まで読んでくださり、ありがとうございました^^

【初心者向け】管理者ユーザーと管理者用controllerの追加方法[Ruby, Rails]

はじめに

どうもこんにちは、エンジニアとして就職を目指しているタヌキです。 2回連続でエンジニア(勉強中)っぽいことを書かなかったので、今回は勉強のお話をします。

今、個人でこんな感じのすごろくアプリを作っています。

Image from Gyazo

武蔵新城(JR南武線)周辺で「地域をもっと面白くしよう!」という人たちの集まりで作った、こんなすごろく(紙版:こちらも途中のものです。すみません。マス目の中にレストランを書き込んで、出た目のレストランに行って美味しいご飯を食べるという作りになっています)を(勝手に)アプリにしてみました。

すごろくの画像

ただし、地域のお店の情報を勝手にすごろくやアプリに登録してしまうといけないようなので、レストラン情報の登録(編集・削除も)は管理者のみが行えるようにしたいと思います。

そこで、管理者機能を実装することにしました。

すごーく初心者向けに書いていますので「そんなの知っているよ!」という人はどうぞ読み飛ばしてくださいね。

Userに管理者(admin)を追加する

まず、usersテーブルにadminというカラムをboolean型で追加して、デフォルトを0とします。

#コンソール
 rails g migration AddAdminToUsers
#migrationファイル
class AddAdminToUsers < ActiveRecord::Migration[5.2]
  def change
    add_column :users, :admin, :boolean, default: false
  end
end

migrationファイルを編集したら、

rake db:migrate

を実施します。

次に、管理者権限をもつユーザーをseedファイルで追加します。

# seeds.rb

User.create!(username:  "管理者",
             email: "admin@example.jp",
             password:  "11111111",
             password_confirmation: "11111111",
             admin: true)

作成したら、

rake db:seed

で管理権限のあるuser情報をusersテープルに追加します。

この辺りの手順は、こちらのRailsチュートリアルの記述が詳しくて分かり易かったです。

このように管理者を追加することで、

current_user.admin?

などのメソッドが使えるようになります。

管理権限のあるユーザーとしてログインした場合にのみ特定のボタンを表示させる、 程度のシンプルな処理で良い場合には、こちらで実装は終わりとなります。

(セキュリティ上いろいろ配慮したい場合には、Railsチュートリアルをご覧ください)

一般ユーザーと管理ユーザー用のcontrollerを分ける

扱いたい機能が多岐にわたる場合には、管理ユーザー用のcontrollerと一般ユーザーのそれとを分けた方が便利だと思います。私も、今回は以下の方法でcontrollerを分けました。

app/controllers/admin 下に新たにcontrollerを作成する。

今回は、app/controllers 内に新たに admin というディレクトリを作成し、そこに、一般ユーザー用のものとは別に、restaurants_controller を作成したいと思います。

# ターミナル
rails g controller admin::restaurants

これで、一般ユーザー用と、管理ユーザー用の二つのrestaurants_controller.rbができました。 この時のディレクトリ構造はこんな感じです。

gyazo.com

この時、プログラムはディレクトリ構造からは /admin/restaurants_controller.rb の位置を探し当てることができません。

そのため、/admin/restaurants_controller.rb 内には下記のように「Admin::RestaurantsController」の「名前空間」を利用して、現在のディレクトリ構造を明記します。

class Admin::RestaurantsController < ApplicationController
 
  #中略

end

ついでに、管理ユーザー以外で特定のアクションを実行しようとした場合には、トップページにリダイレクトさせる、 if_not_adminメソッドも作成し、before_actionで設定しました。

class Admin::RestaurantsController < ApplicationController
  before_action :if_not_admin

  #中略

  private
  def if_not_admin
    redirect_to root_path unless current_user.admin?
  end
end

最後に、edit, show, destroy などのアクションで使用する変数をセットします。

class Admin::RestaurantsController < ApplicationController
  before_action :if_not_admin
  before_action :set_restaurant, only: [:show, :edit, :destroy]

 # 中略

  private
  def if_not_admin
    redirect_to root_path unless current_user.admin?
  end

  def set_restaurant
    @restaurant = Restaurant.find(params[:id])
  end
end

そのほかのアクションに必要な設定は別途していると思ってください。

routingの設定

この時のルーティングは下記ように設定しています。 restaurants#indexやrestaurants#show が二つあることになりますが、それぞれ、管理ユーザー(admin)用と、一般ユーザー用とに分けることができました。

# routes.rb

resources :restaurants, only: [:index, :show] 
  namespace :admin do
    resources :restaurants, only: [:index, :new, :create, :show,  :edit, :destroy]
  end
end

rake routesの結果も下記の通り。

Image from Gyazo

管理者用のページは /admin/restaurants (indexアクション) など /admin ディレクトリ下に配置することができています。 これで、管理者用ページと、一般ユーザー用ページが分かれて全体的にわかりやすいサイトの構造になりました^^

Gemについて

なお、管理者画面なども作りたい場合には、

rails_admin」(管理画面を生成するGem) 「cancancan」(管理者権限を設定するGem)

などがあるようです。 こちらも機会があれば調べてみたいです。

それでは、ここまで読んでくださりありがとうございました^^ 次回は、form_withでselect boxを実装した時の設定が色々勉強になったので、それについて投稿してみたいと思います。

6/13追記:

6/11投稿時点では、edit, showなどの一部アクションが表示できないエラーが発生しておりましたが、その後無事解決しました。(単純な記述ミスでした。トホホ・・・)

ありがたいことに、お仕事をぽろぽろいただいてしまった。いただけた背景の考察とまとめ。

どうもこんにちは、デザイナー兼フロントエンドエンジニア(修行中)のタヌキです。

プログラミングスクールが終わって早10日弱。その間何をしていたかというと…

名刺を作ったり
受託した事業のチラシを作ったり
パンフレットを作ったり
パソコン講習の教科書を作ったり
WEBサイトを作ったりと

個人事業主としてのお仕事をバリバリしていました^^;

f:id:azmengineer:20190610112805j:plain
今年度獲得した事業のチラシ

しかも8割以上DTPの仕事でしたので、コードはほとんど書けていません(涙)
もうすぐ一区切りなので、それから頑張ります。。。

仕事を辞めてはや2ヶ月。
その間スクールに通いつつでしたが、本当に本当にありがたいことに、たくさんのお仕事をいただいてしまいました。

昼前から夜遅くまでスクールに通いつつ、受けたお仕事は8件くらい…?
個人事業主駆け出しとしては、結構すごい数なのではないでしょうか?

(あ、でも就職は目指しています!落ち着いたらすぐ就活始めます!!)

友人にも

「そんなにお仕事獲得できてすごいね〜」

と(呆れ半分かもしれませんが)褒めてもらえたので、どうやってお仕事を獲得したのか、知見をまとめておこうと思います。

あくまでも、私の経験に基づいたところもあると思いますが、出来るだけ汎用性の高そうな内容を抽出してお話ししますので、これからお仕事を獲得しよう!という方のご参考になれば幸いです。

ここでは、お仕事を獲得するに至った方法を「手段」、お仕事を獲得した経路を「ルート」にわけて、それぞれにやってきたことをお話ししようと思います。


まずは獲得の「手段」から。

手段1:ボランティア活動/人助け・お手伝い

実は私、誰かに喜んでもらうのが趣味でして、時間が許す限り、いろいろな知り合いのところでボランティアをしていました。

今、一番大きな仕事をいただいている団体さんからは、

(1)チャリティーラソン大会のブース運営、
(2)マーケティングツールの作成支援、
(3)マーケティング戦略提案

など、色々と(楽しんで)お手伝いさせていただきました。

そんな中で、自然と「タヌキさん、デザインやれるんだって?これ頼める??」
と制作系のお話もいただいた形になります。

「誰かの力になれる」というのが楽しくて、力不足ながらも誠実にお手伝いさせて頂いたので「頼むならこの人」と思っていただけた様です。

f:id:azmengineer:20190610121746j:plain
以前にマラソン大会運営のボランティアをした時の写真

手段2:いろいろなイベントへの参加

二つ目は、繰り返しいろいろなお仕事をくれるある個人商店。
こちらはそこのお嬢さんと、ソーシャルビジネスの勉強会で会ったのがきっかけで最初のお仕事いただきました。

大変ありがたいことに、お嬢様が、お父様に紹介してくださった形です。

もちろん、最初は名刺などの小さなものからでした。

個人事業主として初めてのお仕事だったので、嬉しくて採算度外視でできる精一杯の提案をしました。

複数案のデザインを提案したり、
どんな人に名刺を渡すことが多いのかをヒアリングして、
それに合った内容をご提案したりなど。

結果、大変喜んでいただいて、次第にパンフレット、ウェブサイトなどボリュームのあるお仕事もいただけるようになりました。

▼作成したWEBサイト(この時は既存CMSを加工して使用)
www.yakiniku-sakuraen.com


ここでも相手に喜んでもらいたいという気持ち、
そして誠実に取り組むこと、
さらに色々提案してみた、

というのが次の仕事につながっています。

手段3:SNSでそれなりの数の人に呼びかけてみた

3つ目は、SNSです。

直近の仕事を退職した際に、
「退職します〜、何か私にできることあったら言ってください〜」
SNS上で宣言したところ、複数のお仕事オファーをいただきました(*´∀`)

中でも、元上司が噂をいろいろ聞きつけて、楽しいお仕事をくださいました。
元上司とはSNSで繋がっていないのですがw

気心もしれているし、仕事ぶりも分かるし、頼みやすかったんだと思います。
もちろん、円満退職だったというのも大きかったと思いますけれど。

今回はFacebookで呼びかけたのですが、Facebookでは友達数が700人弱いたのも大きかったと思います。
名刺交換がわりに長年利用してきた効果があったのかもしれません。


以上、
1.ボランティアなど業務外の活動
2.イベントへの参加
3.SNSでの呼びかけ

の三つの手段からお仕事をいただいていた形になります。

また、それぞれの場面において、誠実に仕事をしたり、相手のためにより良いソリューションを見つけられないかいろいろ考えて提案してきました。

次に、仕事を獲得した「ルート」について、いろいろ考えてみたいと思います。

ルート1:友人

まず、SNSでの繋がりも含めた「友人」の繋がりが一番大きかったです。

特に、私の周りにはソーシャルビジネスをやっている人が多かったので「小さな起業家」「自分で事業を持っている、または自分で事業を動かせる」立場の人が多かったのが1番の要因だと思います。

もちろん、人として好きなのでおつきあいさせていただいている間柄にはなりますが、どんな友人が何人いるか、そしてその方々と、緩く良い紐帯を保ちながらつながっていたことが結果に繋がりました。

ルート2:仕事上の繋がり

また、今回オファーをいただいた方の大半は、仕事を通じてつながった方々でした。いろいろな人に出会える幸運な立場で仕事をさせていただいていたのもあるかもしれませんが、仕事ぶりを知っていただいた上でつながっていたこと、そしてその後もSNSなどで自分の価値観や仕事の様子を発信していたので、人としてあるいは職業人として信頼していただいたのだと思います。

ルート3:家族

こちらは、まだ獲得には至っていないのですが、ありがたいことに、夫が私の仕事を方々に売り込んでくれているようです^^;
夫のつながりにも小さな事業の主さんがたくさんいるので、「何か力になれることがあれば」との気持ちで、お話をきかせていただいています。

ルートについては簡単にまとめましたが、

・起業家や事業主と繋がる
・ゆるーく良好な関係を保つ
・自分の仕事ぶりについて発信して知ってもらう

などが共通項としてあげられるかと思います。

補足

以上、いろいろ書かせていただきましたが、誤解を招かないようにお伝えしたいのは、私は決して「お仕事が欲しいから」という理由で誰かとつながったことはなく、

その人がやっていることが素敵で
その人が人間として好きで
単純に友達になりたいから

つながっています。

今回たまたま、「お仕事の依頼」という形でも繋がらせていたくことができました。
それ自体は大変ありがたいし嬉しいことで、これからも何とぞよろしくお願いしますという想いです。
これからも、私にできることがあれば可能な限りお手伝いさせていただきたく思っています。

人と繋がることでお仕事以上に得られるものはたくさんありますし、何より楽しいです。
これから個人でお仕事を獲得しよう!と思っていらっしゃる方も、どうぞ楽しみながらいろいろな方と交流を深めていっていただけましたら幸いです。
目指せ、友達1000人!

以上、長くなりましたが最近のお仕事の経路のまとめでした。
(・・・今回も簡潔に書けなかった。。。)