20190522のRailsに関する記事は15件です。

rails6.0でWARNING"DEPRECATION WARNING: Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1"が発生する理由

出力するケース

railsのバリデーションuniquenessの"大文字小文字の区別"と、対するDBのユニーク制約の"大文字小文字の区別"に不整合があるときに発生します。

具体例

たとえば、railsで以下の様にmodelを定義していたとします。

class Account < ApplicationRecord
  validates :email, uniqueness: true
end

そして、DBにMysqlを使用していてaccounts.emailutf8mb4_unicode_ciなどのcase insensitiveなcollationを指定していたとします。
この時にも同様のWARNIGが出力されます。

出力する理由

Accountモデルのバリデーションuniquenesscase_sensitiveオプションが未指定なのでデフォルトの挙動case_sensitive = trueになります。

その為、railsでのユニークバリデーションは
「大文字小文字の区別をするユニーク制約」を行います。

一方、DBのcollationはutf8mb4_unicode_ciなので、
「大文字小文字の区別をしないユニーク制約」を行います。

この不整合がMysqlでは様々な問題を起こしていたそうで、
rails6.1では仕様変更を行い、デフォルトの挙動を"DBのcollationに合わせる"にする様です。

なのでこのケースだとrails6.1以降はAccountのユニークバリデーションもDBにあわせて
「大文字小文字の区別をしないユニーク制約」に変更されます。

WARNIGの意味

"このケースだとrails6.1以降は挙動が変わるから、rails6.0以前(現在)の挙動をを維持したい場合は
明示的にcase_sensitive:trueを指定してね"って事っぽいです。

railsでのユニークバリデーションは
「大文字小文字の区別をするユニーク制約」を行います。

一方、DBのcollationはutf8mb4_unicode_ciなので、
「大文字小文字の区別をしないユニーク制約」を行います。

参考

https://blog.kamipo.net/entry/2019/05/15/152652
https://railsguides.jp/active_record_validations.html#uniqueness

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

RubyonRailsでtwitter風webアプリケーションの作成 STEP2:ユーザーの編集、削除

ユーザー一覧から詳細ページに移動する

app/views/users/index.html.erb
<div class="container">
<h1>twitter</h1>
<% @user.each do |user| %>
<p><%= link_to user.email,user_path(@user) %></p> #ここを変更
<% end %>
</div>

showメソッドの追加
editメソッドの追加
updateメソッドの追加
destroyメソッドの追加
update用のストロングパラメーター作成

app/controllers/users_controller.rb
  def show
    @user = User.find(params[:id])
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    @user.update(user_update_params)
    redirect_to root_path
  end

  def destroy
    @user = User.find(params[:id])
    if @user.destroy
    redirect_to root_path
    end
  end

  private
  .
  .
  def user_update_params
    params.require(:user).permit(:email)
  end

showビューの作成

app/views/users/show.html.erb
<h2><%= @user.email %></h2>
<br>
<p><%= link_to "Eメールアドレスを編集する",edit_user_path(@user) %></p>
<p><%= link_to "このユーザーを削除する",user_path(@user),method: :delete %></p>

editビューの作成

app/views/users/edit.html.erb
<div class="row">
<div class="col-md-6 col-md-offset-2">
  <h1>ユーザーを編集する</h1>
  <%= form_for(@user) do |f| %>
  <p><%= f.label :email , "メールアドレス"%></p>
  <p><%= f.email_field :email %></p>
  <p><%= f.submit "更新する", class: "btn btn-primary" %></p>
  <% end %>
</div>
</div>

一旦ブラウザで確認

コマンドライン
$ rails s -b 192.168.33.11 -d #192.168.33.11はipアドレスを確認してください

こんな感じです

スクリーンショット 2019-05-22 21.51.36.png

スクリーンショット 2019-05-22 21.51.44.png

スクリーンショット 2019-05-22 21.51.56.png

今回はここまで

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Cloud9 エラー: No space left on device の解決 (実際にスペースがない場合)

No space left on device というエラー。容量がないことを示すエラーだが、容量が余裕なのにこのエラーがでる怪奇現象もある見たい。今回は、ちゃんと容量がない時の対処法を書く。

ファイル容量を確認
$df -h

Filesystem Size Used Avail Use% Mounted on
/dev/sda1 15G 15G 0 100% /
none 312M 0 312M 0% /dev/shm

100%容量使っています。
解決方法: 容量を増やします。

解決の流れ

https://console.aws.amazon.com/
上記AWSコンソールから操作する。

1 インスタンス停止

公式 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Stop_Start.html
右側のナビゲーターペインで、、

インスタンスを選択 → 容量を増やしたいワークスペースのアベイラビリティ(us-east-xx)を確認し、選択して、アクション→状態→停止 をしておく

2 ヴォリュームデタッチ

右側のナビゲーターペインで、、

Volumeを選択 → 容量を増やしたいワークスペースのアベイラビリティ(us-east-xx)を確認し、選択して、アクション→ボリュームのデタッチ

*あとで使うのでボリュームIDをコピーする

3 ボリュームのスナップショットをとる

右側のナビゲーターペインで、、

スナップショットを選択 → スナップショットの作成
ボリュームIDをペースト、コメントは任意だけどワークスペース名とか入れると作業しやすい。

4 スナップショットを使って新しいボリュームを作る

そのままスナップショットの画面で、スナップショットを選択し、アクションから、ボリュームの作成を選択。
大きさはスナップショットより大きくなるようにする。
アベイラビリティゾーンは、該当ワークスペースのものを選択する。

5 スナップショットのアタッチ

公式 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-restoring-volume.html
右側のナビゲーターペインで、、

ボリュームを選択 → 製作したスナップショットを選択し、アクションからボリュームのアタッチをする。このときのインスタンスIDは、アタッチ先のもので。手順1で訪れたインスタンスの画面から確認できる。

注 この時重要なのが、デバイスがデフォルトで/dev/sdfとなっているが、Cloud9なら、/dev/xvdfとしないと、インスタンスの起動に失敗する。



状態がin-use になったら、ワークスペースにアクセスしてインスタンスを起動できるはず。

参考
https://stackoverflow.com/questions/6151695/ec2-instance-on-amazon-and-i-am-greeted-with-no-space-left-on-the-disk
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsでminitestを使用する時の初期設定

はじめに

railsでminitestを使ってテストをする時の初期設定をしていきます。
随時追記していきます。

事前準備

group :test do
 gem 'rails-controller-testing'
 gem 'minitest'
 gem 'minitest-reporters'
 gem 'guard'
 gem 'guard-minitest'

minitest-reportersの使い方

test/test_helper.rbに下記を追加。

require "minitest/reporters"
Minitest::Reporters.use!

この変更によりテスト結果に色が付きます。

guardの使い方

下記で初期化をする。

bundle exec guard init

bundle exec guardを実行する。
これでコードを変更した際に自動でテストが行われます。

bundle exec guard
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails Tutorial(2週目)-3-

静的なページの作成

動的なページとはデータベースと連携しているページ
静的なページとはHTMLファイルだけで構成されているページ

コントローラの生成

$rails generate controller コントローラ名(キャメルケース) アクション名1 アクション名2
アクションと同時にそれに対応するビューも生成される。

キャメルケース(英: camel case)は、複合語をひと綴りとして、要素語の最初を大文字で書き表すことをいう。キャメルケースとは、大文字が「らくだのこぶ」のように見えることからの命名である。

スネークケースとはコンピューターで、スペース(空白)を入れずに複合語を表記する際、下線記号(アンダースコア)を用いる方式。プログラミング言語やファイル名、ハッシュタグなどに用いられる。名称は、文字列がヘビ(スネーク)のように見えることから。

$ git add -A
$ git commit -m "Add a Static Pages controller"
$ git push -u origin static-pages
以降は、$git pushのみで同じ事ができる

失敗した場合にもとに戻す

controllerの場合
$rails generate controller StaticPages home help
$rails destroy controller StaticPages home help

マイグレーションの場合
$ rails db:migrate
一つ前に戻るのは
rails db:rollback
最初の状態に戻したいときは
$ rails db:migrate VERSION=0
マイグレーションにはバージョン番号が付与されるため、バージョンを指定すればその状態まで復元できる。

HTTPメソッドについて

GETは最も頻繁に使われるHTTPリクエストで、主にWeb上のデータを読み取る (get) ときに使われます。「ページを取得する (get a page)」という意味のとおり、ブラウザはhttp://www.google.com/やhttp://www.wikipedia.org/などのWebサイトを開くたびにGETリクエストをサイトに送信します。

POSTは、GETの次によく使用されるリクエストで、ページ上のフォームに入力した値を、ブラウザから送信する時に使われます。例えばRailsアプリケーションでは、POSTリクエストは何かを作成するときによく使われます (なお本来のHTTPでは、POSTを更新に使ってもよいとしています)。例えばユーザー登録フォームで新しいユーザーを作成するときは、POSTリクエストを送信します。

他にも、PATCHと DELETEという2つの操作があり、それぞれサーバー上の何かを更新したり削除したりするときに使われます。これら2つの操作は、GETやPOSTほどは使われていません。これは、ブラウザがPATCHとDELETEをネイティブでは送信しないからです。しかし、Ruby on Railsなどの多くのWebフレームワークは、ブラウザがこれらの操作のリクエストを送信しているかのように見せかける技術 (偽装) を駆使して、PATCHとDELETEという操作を実現しています。結果として、Railsはこの4つのHTTPリクエスト (GET・POST・PATCH・DELETE) を全てサポートできるようになりました。

テスト駆動開発について

テスト駆動開発 (TDD) とは、テストの手法の1つで最初に「正しいコードがないと失敗するテスト」を書き、次に本編のコードを書いてそのテストがパスするようにする方法。

TDDのメリット

・テストが揃っていれば、機能停止に陥るような回帰バグ (Regression Bug: 以前のバグが再発したり機能の追加/変更に副作用が生じたりすること) を防止できる

・テストが揃っていれば、コードを安全にリファクタリング (機能を変更せずにコードを改善すること) ができる

・テストコードは、アプリケーションコードから見ればクライアントとして動作するので、アプリケーションの設計やシステムの他の部分とのインターフェイスを決めるときにも役に立つ。

TDDか一括テストかの目安

・アプリケーションのコードよりも明らかにテストコードの方が短くシンプルになる (=簡単に書ける) のであれば、「先に」書く
・動作の仕様がまだ固まりきっていない場合、アプリケーションのコードを先に書き、期待する動作を「後で」書く
・セキュリティが重要な課題またはセキュリティ周りのエラーが発生した場合、テストを「先に」書く
・バグを見つけたら、そのバグを再現するテストを「先に」書き、回帰バグを防ぐ体制を整えてから修正に取りかかる
・すぐにまた変更しそうなコード (HTML構造の細部など) に対するテストは「後で」書く
・リファクタリングするときは「先に」テストを書く。特に、エラーを起こしそうなコードや止まってしまいそうなコードを集中的にテストする

埋め込みRuby

app/views/static_pages/home.html.erb
<% provide(:title, "Home") %>
<!DOCTYPE html>
<html>
  <head>
    <title><%= yield(:title) %> | Ruby on Rails Tutorial Sample App</title>
  </head>
  <body>
    <h1>Sample App</h1>
    <p>
      This is the home page for the
      <a href="https://railstutorial.jp/">Ruby on Rails Tutorial</a>
      sample application.
    </p>
  </body>
</html>

<% ... %>と書くと、中に書かれたコードを単に実行するだけで何も出力しない。<%= ... %>のように等号を追加すると、中のコードの実行結果がテンプレートのその部分に挿入される

ブロックとyieldについて

ブロックとはメソッドの引数として渡すことができる処理のかたまり
例えば…

numbers = [1, 2, 3]
sum = 0
numbers.each do |n|
  sum += n
end

というコードでは、eachメソッドが配列numbersから要素を一つずつ取り出し、その値をdo以降のブロックに渡している。

yieldはブロックに引数を渡したり、ブロックの戻り値を受け取ったりできる。

def greeting 
  puts 'aa'
  text = yield 'bb' 
  puts text
  puts 'cc'
end

greeting do |nn|
  nn * 2
end

=> aa
   bbbb
   cc

上の処理では,

①puts 'aa'
②bbはブロック引数として、ブロックに渡され、yieldにより、ブロックの処理を行う
③bbがブロック引数nnに代入されブロック内の処理が行われる
④ブロックの戻り値をyieldが受け取り、それが変数textに代入
⑤puts text
⑥puts 'cc'
の流れ

個人的な理解としてはyieldはブロックを呼び出し、その戻り値を返す処理。

provideとyieldの関係

以上を整理した上で、先程のprovideとyieldが出てくるコードを見ると
provideヘルパは、:title というラベルと "Home"という文字列を関連付けており、yieldによってそれを呼び出している形。
あまり、ブロック処理のときのyiledとは関係ないのかな?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

EKS 上のコンテナでファイル監視数の上限を増やす

EKS 上のコンテナで Rails アプリケーションを動かしているのですが、
ある日コンテナ内で rails console が立ち上がらなくなったので調査しました。

$ rails c
FATAL: Listen error: unable to monitor directories for changes.
Visit https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers for info on how to fix this.

https://github.com/guard/listen/wiki/Increasing-the-amount-of-inotify-watchers を見ると
fs.inotify.max_user_watches の上限を変えてあげれば問題なさそうです。

現在の設定を確認します。

$ cat /proc/sys/fs/inotify/max_user_watches
8192

参考サイトの通りに変更できるか試してみます。

$ echo fs.inotify.max_user_watches=524288 | tee -a /etc/sysctl.conf && sysctl -p
fs.inotify.max_user_watches=524288
sysctl: setting key "fs.inotify.max_user_watches": Read-only file system

ははーん。まぁ、なんとなく分かってたけど。。。
どうすればええんや。

これはNG

Docker コンテナなので、最終的には、Image で設定したくなりますよね。

FROM ruby:2.6.2-slim-stretch
...
RUN echo "fs.inotify.max_user_watches=524288" | tee -a /etc/sysctl.conf
...

で、build は通るものの、実際の値は変わず。

これはOK

それらしき、ありがたい記事を見つけました
「DockerはKernel共有する」とよく聞くけどそれによって何が起きるか調べてみた#記事が長いので先に結論

特にカーネルパラメータで上限設定されているものが共有されていると、コンテナ・ホスト間でリソースの奪い合いが起きます

つまり、EC2 の設定をコンテナで引き継いでいるのでは。
EKSのノード(EC2)内で設定してみます。

$ echo "fs.inotify.max_user_watches=524288" >> /etc/sysctl.conf && sysctl -p

コンテナ内で再確認

$ cat /proc/sys/fs/inotify/max_user_watches
524288
$ rails c
Running via Spring preloader in process 194
Loading staging environment (Rails 5.2.3)
irb(main):001:0>

めでたしめでたし。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Railsのコード埋め込み<% %> の書き方いろいろ

Railsのコード埋め込みは「-」を書くことで改行や空白文字がでなくなる。

コード実行 表示 前の空白 後の改行
<% ... %> ×
<%= ... %>
<%- ... %> × ×
<% ... -%> ×
<%- ... -%> × ×
<%# ... %> × ×
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails6 のちょい足しな新機能を試す21(html_safe編)

はじめに

Rails 6 に追加されそうな新機能を試す第21段。 今回のちょい足し機能は、 String#html_safe 編です。
Rails 6.0 では、 html_safe?true な文字列から [] でインデックスを指定して抜き出した部分文字列も html_safe? が true となるようになりました。

Ruby 2.6.3, Rails 6.0.0.rc1 で確認しました。Rails 6.0.0.rc1 は gem install rails --prerelease でインストールできます。

$  rails --version
Rails 6.0.0.rc1

Rails プロジェクトを作る

$ rails new rails6_0_0rc1
$ cd rails6_0_0rc1

Controller と View を作る

controller と View を作ります。

$ bin/rails g controller html_safe index

HtmlSafeController#index を修正する

controller で、html_safe な文字列を作成し、そこから一部を抜き出します。

app/controllers/html_safe_controller.rb
class HtmlSafeController < ApplicationController
  def index
    str = '<em>This is HTML safe string first part</em><strong>This is HTML safe string second part</strong>'.html_safe
    i = str.index('<strong>')
    @html_safe_str1 = str[0...i]
    @html_safe_str2 = str[i..]
  end
end

View を修正する

index.html.erb で controller で抜き出した一部の文字列を表示します。

app/views/html_safe/index.html.erb
<h1>HtmlSafe</h1>
<p>
  @html_safe_str1 = <%= @html_safe_str1 %>
</p>
<p>
  @html_safe_str2 = <%= @html_safe_str2 %>
</p>

rails server を実行して表示する

bin/rails s を実行してブラウザから http://localhost:3000/html_safe/index にアクセスします。
html safe な文字列として処理されていることがわかります。

2019-05-19-091744_414x128_scrot.png

Rails 5 では?

Rails 5.2.3 では、抜き出した文字列の html_safe?false になるため、以下のようにエスケープ処理されてしまいます。
2019-05-19-091825_466x63_scrot.png

試したソースは以下にあります。
https://github.com/suketa/rails6_0_0rc1/tree/try021_html_safe

参考情報

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

error Command "webpack-dev-server" not found. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

$ bin/webpack-dev-server

で出るタイトルのエラー

error Command "webpack-dev-server" not found. info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

解決コマンド

yarnのアップグレード

$ brew upgrade yarn

webpackerインストール

$ bundle exec rails webpacker:install

webpack-dev-server立ち上げ

$ bin/webpack-dev-server
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue. Make sure that `gem install mysql2 -v '0.5.2' --source 'https://rubygems.org/'` succeeds before bundling.

git clone して来てbundle
しようとしても、

Fetching mysql2 0.5.2
Installing mysql2 0.5.2 with native extensions

でつまずいて進まない、、、

ボクの場合の解決方法

rubyのバージョンを-v 2.5.3に変更してGemfile.lockを削除

$ rbenv local 2.5.3
$ sudo rm -rf Gemfile.lock

解決コマンド

$ brew install openssl
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
$ bundle install

参考サイト

https://qiita.com/Yutazon/items/8d1e538b8c89fc7bda3c

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで"A server is already running"でコンテナから抜けてしまうが、server.pidが見つからない場合

環境

macOS High Sierra 10.13.6
Doker Version: 18.09.2
rails 5.2.1

問題

docker-compose upでコンテナを立ち上げたところ、途中までうまくいくが、最後以下のようになりコンテナを抜けてしまう。
しかしtmp/pids/server.pidが見つからない。

=> Booting Puma
=> Rails 5.2.1 application starting in development
=> Run `rails server -h` for more startup options
A server is already running. Check /[rootディレクトリ]/tmp/pids/server.pid.
[rootディレクトリ]_1  | Exiting

解決法

Ctrl-cのあとdocker-compose stopでコンテナを停止させた後、もう一度doker-compose upで立ち上げる。
立ち上げ〜コンテナから抜けてしまう間に、別ウィンドウで素早く以下コマンドを入力。

$ docker-compose exec [rootディレクトリ] /bin/bash
~@~:/[rootディレクトリ]# rm tmp/pids/server.pid

1行目でコンテナ内のbashに入り、2行目でファイルを削除。

考察

自分の場合、ローカルにはtmp/pids/server.pidが見つからなかったが、コンテナ内には存在していた。
コンテナを停止している間はコンテナ内のbashに入れなかったのでこうしたアホなやり方になってしまった。
しかしこれで立ち上げることはできました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

モデルに書いた定数を参照する

environment.rb

config/environments/は環境単位の設定ファイルを格納するディレクトリ(Railsドキュメント参照)
で簡単にまとめると、よく使う定数を置いて置ける場所という認識

でも共通でこの定数は使わないよって場合はモデルに書いた方が見やすいのでモデルに定数を書く

モデル

モデルに書くときも書き方は変わらないが、呼び出し方が違う

expert_collection_achieved.rb
  COMPLETE_STATUS = {
    :not_achieved => 0,
    :achieved => 1
  }

書き方としてはこんな感じで

environment.rbに書いたものを呼び出すときはCOMPLETE_STATUS[:achieved]1が表示される

モデルに書いたものだと、モデル名::COMPLETE_STATUS[:achieved]で呼び出す

ex) ExpertCollectionAchieved::COMPLETE_STATUS[:achieved]

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Rails: 検索フォームでLike演算子を使うときはsanitize_sql_likeを使おう

備忘録

Webアプリを作るとき、必ずどこかで検索フォームを実装するときがあるかと思う。
その際に、ただ何も考えずに今までは、Like演算子を使ってきたがそれだとまずいということが分かったので備忘録として残しておく

railsではsanitize_sql_likeを使うことで検索でLIKE演算子のワイルドカードである_や%が使われてもエスケープすることができる

じゃあどのように書くのか?

User.where(user_type_id: 2).where(['second_prefecture_code LIKE ? or specialized_field LIKE ?', "%#{sanitize_sql_like(searchFirst)}%", "%#{sanitize_sql_like(searchSecond)}%"])

一例だが、上記のように書くことで、ワイルドカードである_や%が使われてもエスケープできるようになるはずである。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

一番わかりやすいパンくずの実装(gem 'gretel')

今回はパンくずの実装についての記事を分かり易く説明します。

パンくずとは?

下記の画像のように画面遷移してきて、自分がどの位置にいるのか視覚的に分かり易く表示しているこれらをパンくずと総称しています。
また、リンクも持たせられるので、画面を戻る際にクリックしたら遷移するのでUI的にも優しいです。

下記メルカリの参考画像です。
スクリーンショット 2019-05-22 0.31.56.png

導入手順

使用gemは下記です。

gem 'gretel'

:writing_hand: _breadcrumbs.html.haml(パンくずview)の説明

パンくずを表示させるViewを部分テンプレートに分けておく。
(分けないでも良いが、変更や調整の際にメンテナンスを容易にするため)
下記以外の方法もあるが、私の場合は分かり易く呼び出されたコントローラーと、その先のアクション名でパンくずの表示を切り替えれるようにcase文を使い組んでいる。

case文については過去の記事を参考にしてください。
case文での条件分岐方法

case params.values_at :controller, :actionの部分は
binding.pryでデバックした際にコントローラー名とアクション名が入っているのを確認できるので、
when ['users', 'show']とすることでusersコントローラーのshowアクションに遷移したい際にこちらが参照される。

breadcrumb :user_showの部分は次々項で説明するconfig/breadcrumbs.rb内のメソッドを呼び出すためのメソッド名(readcrumbs.rb側のメソッド名)。
少し紛らわしいが、先にこちらでメソッド名を命名してしまってreadcrumbs.rb側に当てがった方がスムーズなので私の場合はこのような手順で進めています。

末尾にあるに下記のコードは、表示を区切る際に間に入る記号などを指定できる。
見慣れない文字が入っている部分はHTMLの特殊文字になる。
下記のサイトのように様々な記号を当てれる。
https://www.benricho.org/symbol/tokusyu_02_arrow.html

= breadcrumbs separator: " &nbsp;&nbsp;&#12297;&nbsp; "

上記の結果が下記のように変換される。
>の前後に空白を入れている。
= breadcrumbs separator: "   〉  "

app/views/shared/_breadcrumbs.html.haml
- case params.values_at :controller, :action

- when ['users', 'show']
  - breadcrumb :user_show

- when ['user_chat_rooms', 'index']
  - breadcrumb :user_chat_rooms_index

= breadcrumbs separator: " &nbsp;&nbsp;&#12297;&nbsp; "


:writing_hand: 部分テンプレート反映の準備

上記の部分テンプレートをパンくずを表示させた場所に下記のようにおく。
大体の場合はヘッダーの下に置かれていることがほとんどだと思うので、
ヘッダーの部分テンプレート中に組み込ませた方が効率は良いと思う。

 =render 'shared/breadcrumbs'

:writing_hand: gretel(パンくず)メソッド作成

次にconfig下にbreadcrumbs.rbを作成し下記のように記述。
linkの後に続く部分に画面に表示させたいパンくず名を入力する。
後にroot_pathやuser_chat_rooms_path(user_id:current_user.id)とあるが、
こちらはパンくずの表示部がクリックされた際に画面遷移するためのpathなので、クリックして遷移の必要がなければ記述しなくてのよい。
parent :rootの部分は親のメソッド名を記述する。

config/breadcrumbs.rb
crumb :root do
  link 'ホーム', root_path
end

crumb :user_show do
  link "#{current_user.name}"
  parent :root
end

crumb :user_chat_rooms_index do
  link "メッセージ一覧",user_chat_rooms_path(user_id:current_user.id)
  parent :user_show
end

完成

そして最終的には下記のようになる。
スクリーンショット 2019-05-22 1.16.31.png

次回は少し複雑なパンくずの表示方を記事にします。

``

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[初心者]プログラミングを約250時間学んで感じたこと

はじめに

スクールでプログラミングを学び始めて、約1ヶ月が経ちます。
細かく言えば、今日で25日目になります(笑)
言語としては、
・Ruby ・Rails 
・HTML ・CSS  
を学んできました。
決め事として、1日最低10時間以上を毎日続けるようにしています!
単純計算で、約250時間です。
ということで今回は、全くの初心者が250時間勉強して感じたことを書いていこうと思います。

予想以上のキツさ

多数の言語を短期間に学ぶのは大変ですが、本気でやれば各言語の基礎は学ぶことができました。

ただ、正直かなりキツイです。
スクールは毎日通っていて、25日間1日も欠席はしていません!!!
新しい知識ばかり頭に入ってくる中で、毎日が格闘です(笑)

しかしそのおかげで、全くの無知だった私ですが、今ではTwitterの簡易版のようなアプリであれば自力で作成することができるようになりました!

正直初めは、「これ、本当に自分でも理解できるのか・・・?」
と思ってました。(笑)
ですが、絶対サボらず、折れずに毎日頑張っていたらいつの間にかアプリが作れるようになってました!
人生の中で1番頑張ったといっても過言ではないかもしれせん・・・(笑)

多くの衝撃事実

プログラミングを少しずつ学んでいく中で、「え!?」と思うことがいくつかありました。

まず1つは、
「プログラミングは暗記ではない」
ということです。

私は最初、プログラミングはありったけのコードをたくさん暗記しなきゃいけないと思ってました。(笑)

しかし、学んでいく中で
「わからないことがあったらすぐに調べて、それを適応させる能力」
がとても大事なのだと気付かされました。

「プロのエンジニアでもGoogleは必須なんだよ」と言われてから、私の勉強法は8割がアウトプット作業ばかりです。

2つ目は、
エラーの多さ、難しさです。

アプリを作成する中で、エラー、エラー、エラー、エラー・・・・・。
どれだけ調べても解決できないものだったり、本当に折れそうになります。(笑)

各言語における仕組み等を理解していないとエラーが解決できないため、
エラーが起きるたびに土台の脆さを痛感させられました。

ですが、数をこなすうちに段々と理解できて、簡単なエラーなら1人で解決できるようになることができました^^

しかし、実際まだたくさんの種類のエラーがあると思うので、勉強して数をこなしていくしかないですね・・・

おわりに

まだまだ、ほんの一部を学んだだけです。

もっといえば、基礎も全て完璧とはいえず、まだまだ知識不足だといえます。
これからもコツコツ努力して、一人前のプログラマーになれるよう日々精進です・・・

明日からは、「Javascript」「jQuery」を学んでいこうと思います!

ありがとうございました^^

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む