U-Yuri’s 健忘録

U-Yuri’s 備忘録

プログラミングを勉強しています。アウトプットに活用しているブログです。

【Ruby Silver】90%で合格しました!

はじめに

現在フィヨルドブートキャンプおよび独学でRubyおよびRailsについて学んでいる。もっと知識を深めたいと思いRuby silverの試験をうけることにし、模擬テストを解いてみるも38点。しかし本番では90点で一発合格できたので勉強法などを記す。
勉強時間においては以下の通り。

  • 勉強期間:1か月(Rubyについてはスクールで約半年ほど勉強している)
  • 勉強時間:2時間/1日(60時間)

試験概要

  • 正式名称:Ruby Association Certified Ruby Programmer Silver Version 3
  • 50問出題のうち75%で合格
  • 費用:16800円(高いので一発合格しないと出費が...)
  • 最大90分(途中退出OK)

具体的な勉強法

※ここまで過去問題を解いているとテストの傾向など見えてきます。そして自然とメソッドや動きなど覚えていることが増えています。
※私が受けた回では、RExよりも公式テキストからの出題問題と似たような問題が多く出されていました。

わからない箇所や間違えた問題について

試験本番

自信がない箇所およびわからない問題についてはフラッグを立てながら解いたが、なんとわからないが2問、自信がない問題が6問あり焦る。
見直しに関しては、計3回以下に記す。

  1. 1択か2択か間違えてないかだけ見直し
  2. 1からすべて見直し(メソッドの破壊的や非破壊的に関しては特に注意して確認)
  3. フラッグの部分について十分に考えなおす

震えながら終了ボタンを押し、薄目で合否確認すると「合格」と!
30分残し退出(これ以上考えても結果は同じだと判断)。

アドバイス

  • 解答だけではなく選択肢一つ一つ、理由が言えるように。言えない問題はしっかり調べる。
  • 合格した方達のブログもしっかりチェックしておく。
  • 試験前日はしっかり寝ること
  • 試験直前は頭を休めること

試験を受けて

  • まずはコーディングの知識が深まったので、合否関係なくirbで動かしながらの勉強は楽しく、さらにRubyを好きになった。
  • 曖昧だった部分が分かるようになった(classやdef、インスタンス変数やクラス変数)
  • 今後転職しエンジニアになり、実務に取り組むようになった際の自分自身の知識の引き出しが増えた
  • メソッドを覚えていると、コードを書いているときなどに「あ!こういうメソッドあったな!」などすぐに調べられると感じた
  • コーディングの幅が広がったと感じる

終わりに

さらにRubyについて興味がわきました。シンプルだがとても自由度が高く表現力豊かな言語だと感じた。今後Goldにも挑戦していきたいし、Railsについても試験があるようなのでチャレンジしていき、RubyおよびRailsの知識をさらに深めていきたい。
そして夢のエンジニアになるぞ!!!!!!!!!!とさらに気合が入った。

無駄使いをなくしミニマリストを目指す人の為のアプリ、「muda0(むだゼロ)」をリリースしました!

はじめに

お金の無駄使いを減らし、ミニマリストを目指すアプリ「muda0(むだゼロ)」をリリースしました。 物欲を減らす理論に基づき作成し、1ヶ月後に見返し本当に必要であれば購入、1ヶ月後に見返し欲しくないものであれば削除する、という趣旨のアプリです。 muda0(むだゼロ)

自己紹介

現在エンジニアへの転職を決意し学習を継続しているゆりというものです。 私は理学療法士として働いてきましたが、ITの世界に惹かれ、webデザイナーへ転職、コーディングにさらに魅力を感じ極めるためにエンジニアとしての転職を決意。 フィヨルドブートキャンプを受講しRubyを中心に学び、現在も学習を継続中です。

アプリ作成の経緯

私はもう既に持っているものを集めてしまう収集癖がありながらも、ミニマリストになりたいという願望があります。物欲を抑える方法について調べていたところ、どうやら欲しいものを記述し1ヶ月後に見返すと意外ともう欲しくないものもあるとか。そこで、欲しいものを登録し合計金額を出すことで物欲を抑え、さらに1ヶ月後に見直すというアプリがるといいなと思い作成しました。

  • 欲しいものの金額を可視化することで物欲を抑える
  • 1ヶ月後に見直すことで、それでも欲しいものか判断する

muda0(むだゼロ)について

各ユーザログインし利用可能となります。
ログイン後、欲しいものの画像、値段、カテゴリーを登録することができるシンプルなアプリです。



以下のように合計金額が表示されるようになっています。

欲しいものはカテゴリー別で表示することも可能です。

更新情報に関しては、メールアイコンより確認可能です。

レスポンシブにも対応しています。

使用技術

現在勉強している新しい技術を使用するため以下の技術を選びました。

苦労した点

最後に

今後もアップデートを助けていきたいと考えています。
具体的な内容は以下になります。

  • 身内でシェアできるようにする(プレゼントなどを考える材料に)
  • 画像がない場合、デフォルト画像を用意
  • 金額が増えるごとにキャラクターの様子が変わっていく

【Rails】既読・未読機能を実装する(自作アプリ:mudazero app)

はじめに

自分で作成しているアプリに、お知らせ機能を追加したが各マイページのお知らせアイコンの横に、未読のものがあればメール画像の上に印(点)をつけ、全て既読しているのであれば印はつけないようにするということをしたい。
※userとnewsについてのモデルは作成済み。

流れ

  1. clickというモデルを作成、user_idとnews_idを外部キーとする。
  2. 各ユーザがニュースをクリックしたら、dbに保存される。
  3. dbがnilだったらdbに保存されて、nilではなかったら保存されない(一番古い情報(クリック時間)のみ保存)。
  4. nilがあればマイページトップページに印がつき、且つ、各ニュース一覧の該当するnilのnewsに「new」がつく。

db作成

まずはクリックしたかどうかのテーブルを作成する。

①今回はclickというテーブルを作成。

$ rails g model click

② userとnewsを外部キーとして設定
③message_show.html.erbに各newsの内容を表示するファイル作成。
wants_controller.rbにまだクリックしたことがないnewsをクリックするとdbに時間とnews_idとuser_idが保存されるコード記述。

def message_show
    @message = News.find(params[:news_id])

    already_clicked = Click.find_by(news_id: params[:news_id], user_id: current_user.id)
    
    if already_clicked.nil?
      Click.create!(
        clicked: params[:created],
        user_id: current_user.id,
        news_id: params[:news_id]
      )
    end
    

    render "message_show"
  end

これで何回クリックしても、古い情報のみ保存され、新しい情報は保存されないコード完成。

お知らせ一覧ページ(news一覧)に未読であれば[new]をつける

wants_controller.rbにクリックの情報がnilかどうか確認のためのインスタンス変数作成。

def message
    @messages = News.all

    @already_clicked = Click.find_by(news_id: params[:news_id], user_id: current_user.id)
    render "message"
  end

②includeを使ってjoinする(newsのテーブルと、clickのテーブルをつなぐ)
where(clicks: {user_id: [current_user,nil]})でclickテーブルの中の、user_id。arrayで[current_user,nil]で、current_userか(or)nilということになる(全ニュースを表示したいのでこのようにした)

def message
    @messages = News.includes(:clicks).where(clicks: {user_id: [current_user,nil]})
    
    render "message"
  end
h1>お知らせ</h1>
<ul>
  <% @messages.each do |message| %>
    <li>
      <% if message.clicks.empty? %>
        <small>new</small>
      <% end %>
      <%= link_to message.title, message_path(message) %>
    </li>
  <% end %>
</ul>

empty?はarrayの結果が[](空)の場合の判断(nilではない)。

これでnewの表示完了。と思ったが、他のユーザがクリックしたnewsが表示されないエラーあり。

もう一度仕切り直し、message.current_user_clickedというふうにcurrent_user_clickedというメソッドの中にcurrent_userが入れられたらいいなぁ。
ということでcurrent_user_clickedというメソッドを作成する。

app/models/news.rbを編集しcurrent_user_clicked`というメソッドを作成する。

class News < ApplicationRecord
  has_many :clicks
  def current_user_clicked(current_user)
    Click.find_by(news_id: id, user_id: current_user.id) #current_userはerbから引数として渡さないと使用できないため引数設定
  end

end

app/views/wants/message.html.erbも編集。

<h1>お知らせ</h1>
<ul>
  <% @messages.each do |message| %>
    <li>
      <% if message.current_user_clicked(current_user).nil? %>
        <small>new</small>
      <% end %>
      <%= link_to message.title, message_path(message) %>
    </li>
  <% end %>
</ul>

これでcurrent_userが読んでいないニュースに関してはnewマークがつくようになった。

トップページのメールアイコンの未読通知印の実装

前回作成したnews.rb内のメソッドを今回も使用。 ①erbの編集

<header>
  <div><h1><span class="logo-jp">むだゼロ</span><br>muda0</h1></div>
  <div class="flex_menu">
    <div class="layer">
      <%= link_to(messages_path) do %>
        <%= image_tag 'mailicon.png' %>
        <% @messages.each do |message|%>
          <% if message.current_user_clicked(current_user).nil? %>
            <p>●</p>
          <% end %>
        <% end %>
      <% end %>
    </div>
    <div><%= link_to "欲しいものを登録", wants_new_path, class: "new_button" %></div>
    <div><%= link_to "ログアウト", destroy_user_session_path, method: :delete %></div>
  </div>
</header>

wants/controller@messages = News.allのみ記述。

【Rails】管理者用画面(お知らせ文編集ページ)を作成 gemなし

はじめに

自身で作成した'mudazero'アプリに、アップデート情報などを通知するお知らせ機能を追加したいので、管理者だけがお知らせを作成できる機能を実装したい。

大まかな流れ

  • Userがadminかどうか判断
  • adminであればお知らせ作成画面を表示することができる。そうでなければエラーになる。
  • お知らせ作成画面は新たに作成。
  • お知らせ文の格納用dbも作成。
  • 各ユーザにお知らせを見せる箇所の作成

手順

① Userテーブルにadmin(管理者)テーブルを追加する(以下の記事参照)。
【Rails】テーブルの追加(sqlite3) - U-Yuri’s 備忘録

rails cから管理者を設定(adminの列にtrueを入れる)。
railsからSQLiteに入れる方法。

irb(main):004> yuri = User.find(2) #管理者にしたい人の情報を変数に入れる。
irb(main):006> yuri.admin = true #adminをtrueにする。(この時点ではまだdbに保存されていないrailsのみ変更された)
irb(main):008> yuri.save #これでdbに保存される

管理者が複数人いる場合や、途中で管理者から外したい場合もこの方法で行う。

②viewの中にadminフォルダを作成し、その中にadmin.html.erbを作成。
% rails g controller adminでコントローラーファイルを作成。 ④管理者(admin=true)の人だけが見れるよう、app/controllers/admin_controller.rbを編集。

class AdminController < ApplicationController
  def admin
    if current_user.admin == true

      render "admin"
    else
      render file: "#{Rails.root}/public/404.html", status: 404
    end

  end
end

⑤お知らせメッセージ(タイトル、メッセージ)のdb作成

$ rails g model news title:string message:text

マイグレーションファイル作成

$ rails db:migrate

あとはdbの各機能の実装。

【Rails】ステータスコードを返す(401を返したい)

renderメソッドのstatusというオプションを使用。

render status: 401

今回の実装

class AdminController < ApplicationController
  def admin
    if current_user.admin = true
      render "admin"
    else
      render file: "#{Rails.root}/public/404.html", status: 401
    end

  end
end

【Rails】テーブルの追加(sqlite3)

はじめに

管理者画面を作成するために、Userテーブルにadminの列を追加したい。

テーブルの追加手順

変更するためのファイルを新しく作成し変更していく形になる。 1. $ rails g migration クラス名 カラム名:データ型でカラム追加や削除のためのファイルを作成する。

  1. 今回はカラムを追加したいので
    % rails generate migration AddAdminToUsers admin:booleanを実行。
    20240429044742_add_admin_to_usersというファイルが作成される。
    boolean = true or faluse の結果が入る時に使用する。

  2. % rails db:migrateでschema.rbに反映される。

create_table "users", force: :cascade do |t|
    t.string "email", default: "", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.string "name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.boolean "admin"
    t.index ["email"], name: "index_users_on_email", unique: true
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true

参考: Rails /テーブル作成、カラムの追加や削除[備忘録] #Rails - Qiita