Rails関連のことを調べてみた2020年07月29日

Rails関連のことを調べてみた2020年07月29日

Rails 複数カラムの追加

##やり方

“`:ターミナル
$ rails g migration AddColumnToUsers
“`

“`ruby:マイグレーションファイル
class AddColumnToUsers < ActiveRecord::Migration[5.2] def change add_column :users, :family_name, :string add_column :users, :first_name, :string add_column :users, :family_name_kana, :string add_column :users, :first_name_kana, :string end end ```

元記事を表示

Ruby on Railsの基本

#プログラミングの勉強日記
2020年7月12日 Progate Lv.181
Ruby on RailsⅠ
 Ruby on RailsはWebアプリケーション開発のフレームワーク。フレームワークを使うと開発に必要な作業を減らせる。

#Railsアプリケーションの準備
 `rails new アプリケーション名`のコマンドでターミナルを実行。コマンドを実行することで、アプリケーション名と同じ名前のフォルダが作成され、その中の開発に必要なフォルダが用意される。

“`:ターミナル
rails new tweet_app
“`

0712.png
 
#サーバーの起動
 開発中のアプリケーションをブラウザで表示するためにはサーバーを起動させる必要がある。サーバーの起動は`rails server`でコマンドを実

元記事を表示

Ruby on Railsでデータベースを扱う

#プログラミングの勉強日記
2020年7月13日 Progate Lv.186
Ruby on RailsⅡ

#データベースとは
 テキストや数値などのデータを保存するためのツール。データベースは表でデータを管理している。表のことをテーブル、縦の列のことをカラム、横の列のことをレコードという。必要に応じて複数のテーブルを作成できる。

#データベースの用意
 マイグレーションファイルと呼ばれるデータベースに変更を指示するためのファイルを作成する。`rails g model モデル名 カラム名:型`で作成できる。モデル名は必ず最初を大文字にして、単数形にする。なので、postsテーブルを作成するが、この場合単数形にする。モデルについては下で記述する。
 マイグレーションファイルは`db/migrate`フォルダの下に作成される。

“`:ターミナル
$ rails generat

元記事を表示

Ruby on Railsのページの作成

#プログラミングの勉強日記
2020年7月14日 Progate Lv.196
Ruby on RailsⅢ

#find_byメソッド
 find_byメソッドはある条件に合致するデータを取得できる。`モデル名.find_by(カラム名: 値)`とすることで、その値を持ったデータをデータベースから取得できる。今回は特定のidの投稿を取得するために使える。

“`terminal:ターミナル
$ rails console
//idが3の投稿データを取得できる
> post=Post.find_by(id:3)
> post.content
=> “Rails勉強中”
“`

#URLにidを含める
 ルーティングのURL部分に`:`を用いて`posts/:id`と指定することで`posts/1`でも`posts/2`でもshowアクションにいくようにできる。

“`ruby:routes.rb
get “posts/index” => “posts#index”
get “posts/:id” => “posts#show”
“`
 `p

投稿の編集と削除機能(Ruby on Rails)

#プログラミングの勉強日記
2020年7月15日 Progate Lv.196
Ruby on RailsⅣ

#投稿の編集
 投稿を編集するには、①編集したい投稿を取得、②その投稿の`content`の値を上書き、③データベースに保存する。`post.content=”新しい値”`で投稿の`content`を上書きできる。

“`terminal:ターミナル
$ rails console
> post=Post.find_by(id:1)
> post.content=”Rails”
> post.save
“`
 投稿データを編集してデータベースに保存すると、`updated_at`カラムの値がデータを更新したときの時刻に更新される。

#投稿の削除
 投稿を削除するには、削除したい投稿を取得し、その投稿に対して`destroy`メソッドを用いる。

“`terminal:ターミナル
$ rails console
> post=Post.find_by(id:2)
> post.destroy
“`

#投稿編集ページ
 どの投稿の編集ページか判別するために投稿編集ペー

投稿の制限(Ruby on Rails)

#プログラミングの勉強日記
2020年7月16日 Progate Lv.205
Ruby on RailsⅤ, Ⅵ

#バリデーション
 不正なデータがデータベースに保存されないようにデータをチェックするシステムをバリデーションという。バリデーションに引っかかった場合(不正なデータの場合)にはデータベースに保存されない。
 バリデーションはモデルで設定する。`validates`を用いてカルム名と内容を指定する。`{presence: true}`を用いることでそのカラムの値が存在するかどうかをチェックできる。

“`ruby:models/posts.rb
class Post < ApplicationRecord validates :content, {presence: true} end ```  `length`を用いて`{maximum:数値}`を指定することで最大文字数を設定できる。 ```ruby:models/posts.rb class Post < ApplicationRecord valida

ユーザ画像の表示(Ruby on Rails)

#プログラミングの勉強日記
2020年7月17日 Progate Lv.207
Ruby on RailsⅦ

#プロフィール画像を表示する仕組み
 データベースに画像のファイル名を保存しておき、そのファイル名の画像を表示する。ファイルを保存するために、usersテーブルにimage_nameカラム(string型)を用意する。

#初期画像の設定
 ユーザの登録時にimage_nameカラムの値が`default_user.jpg`となるようにする`create`アクション内の`@user`を定義しているところで、`new`メソッドの引数として`image_name`を追加する。

“`ruby:users_controller.rb
def create
@user=User.new(
name:params[:name]
email:params[:email]
image_name:”default_user.jpg”
)
….
“`

#ビューに画像を表示
 HTMLの``タグを使う。画像は`public/user_ima

ログイン機能の作成(Ruby on Rails)

#プログラミングの勉強日記
2020年7月18日 Progate Lv.211
Ruby on RailsⅧ

#ログインページの作成
 ログインするためにはログインページからメールアドレスやパスワードなどの情報をRaisに送信する。送信された情報をもとに操作しているユーザを特定しログイン状態とする。ログインページを作るためにルーティング、アクション、ビューを追加する。

“`ruby:routes.rb
get “login” => “users#login_form”
“`

“`ruby:users_controller.rb
def login_form
end
“`

``タグのtype属性をpasswordとすると入力した文字が伏字となるパスワード用のフォームになる。

“`erb:login_form.html.erb

パスワード


“`

#パスワードカラムの追加
 `rails generate migration`を用いて`add_password_to_users`というファイル

アクセス制限(Ruby on Rails)

#プログラミングの勉強日記
2020年7月19日 Progate Lv.211
Ruby on RailsⅧ

#アクション側で共通の変数の定義
 各アクションに対尾したビューファイルはapplication.html.erbの`<%= yield %>`の部分に代入され表示される。各コントローラの全アクションで共通する処理がある場合には、`before_action`を使うと良い。`before_action`を用いることで、アクションが呼び出される際に必ず`before_action`の処理が実行されるので、全アクションで共通する処理を1か所にまとめられる。
 すべてのコントローラで共通する処理はapplicationコントローラにまとめられる。`set_current_user`メソッドを定義し、`before_action`に指定する。

“`ruby:application_controller.rb
before_action :set_current_user
@current_user=User.find_by(id: session[:user_id])
end

テーブルのカラムの型の種類(Ruby on Rails)

#プログラミングの勉強日記
2020年7月20日 Progate Lv.211
Ruby on RailsⅧ

#データベースの用意
 マイグレーションファイルと呼ばれるデータベースに変更を指示するためのファイルを作成する。`rails g model モデル名 カラム名:型`で作成できる。モデル名は必ず最初を大文字にして、単数形にする。なので、postsテーブルを作成するが、この場合単数形にする。モデルについては下で記述する。
 マイグレーションファイルは`db/migrate`フォルダの下に作成される。

“`:ターミナル
$ rails generate model Post content:text
“`
 これを実行すると、`app/models`フォルダにモデルが定義されたファイルと、`db/migrate`フォルダにマイグレーションファイルの2つのファイルが生成される。

##データベースに変更を反映する
 `rails db:migrate`コマンドを実行すると、データベースに変更を反映できる。テーブル作成時には`i

Ruby on Railsの画像の保存場所(assets?public?)

#プログラミングの勉強日記
2020年7月21日 Progate Lv.213
Ruby on RailsⅧ

#assets配下とpublic配下
 Railsではアプリケーション内で使用される設置場所に2つの場所が存在する。それが`public`ディレクトリと、`app/assets/images`ディレクトリである。どちらでも画像を読み込むことができるが、どう違うのか気になったので調べてみた。

#画像を読み込むパス

##assets
app/assets/image配下に画像ファイルを置く場合は、パスから始める必要はなく、画像ファイル名だけでよい。

“`erb
<%= image_tag "sample.jpg" %>
“`

##public
 publicディレクトリに置く場合は、パス`/`から始める必要がある。

“`erb
<%= image_tag "/sample.jpg" %>
“`

#CSSの適応
 CSSの書き方が異なる。

##assets

“`css
background: image-url(“画像のパス”)
background-i

scaffoldについて(Ruby on Rails)

#プログラミングの勉強日記
2020年7月22日 Progate Lv.213
Ruby on RailsⅧ
Progateではscaffoldを扱わないが、学校の授業で勉強したので自分でも調べてみた。

#scaffoldとは
 scaffoldは「スキャフォールド」と読みRuby on Railsのコードを自動生成する便利なものの1つである。Railsアプリケーションの開発をする際にはモデル、コントローラ、ビュー、ルーティングを作成する必要がある。この作業をまとめて行う機能がscaffoldである。なので、scaffoldを使うことでRailsのアプリを早く作ることができる。

#使い方

“`terminal
$ rails generate scaffold モデル名

$ rails generate scaffold モデル名 カラム名:データ型
“`

このコマンドによって以下のファイルが生成される。

1.マイグレーションファイル、モデル(データベースのテーブルやカラムを変更できるファイル)
db/migrate/YYYYMMDDHHMMSS_create_モデル名

投稿とユーザの紐づけ(Ruby on Rails)

#プログラミングの勉強日記
2020年7月23日 Progate Lv.215
Ruby on RailsⅨ

#postsテーブルにuser_idのカラムの追加
 各投稿にどのユーザがその投稿を作成したかという情報を持たせるためにpostsテーブルにuser_idというカラムを用意する。`rails generate migration`を用いて`add_user_id_to_posts`というファイル名のマイグレーションファイルを作成し、マイグレーションファイルを変更して`rails db:migrate`を実行する。

“`terminal
$ rails generate migration add_user_id_to_posts
 マイグレーション変更後
$ rails db:migrate
“`
“`ruby:2020…_add_user_id_to_posts.rb
class AddUserIdToPosts < ActiveRecord::Migration[5.0] def change add_column :posts, :user_id

いいね機能の作成(Ruby on Rails)

#プログラミングの勉強日記
2020年7月24日 Progate Lv.221
Ruby on RailsⅩ

#Likeモデルの用意
 「どのユーザ」が「どの投稿」をいいねしたか記録するためにデータベースに`user_id`と`post_id`の2つのカラムを持つlikesテーブルを用意する。コマンドを実行してLikeモデルとマイグレーションファイルを用意する。

“`terminal:ターミナル
$ rails generate model Like user_id:integer post_id:integer
$ rails db:migrate
“`

“`ruby:models/likes.rb
class Like < ApplicationRecord validates :user_id,{presence: true} validates :post_id,{presence: true} end ``` #投稿にいいねしたかを表示する  投稿詳細ページではログインしているユーザがその投稿にいいねしたデータという条件を満たす場合にいいね済みとする。

安全性の高いパスワードの扱い(Ruby on Rails)

#プログラミングの勉強日記
2020年7月25日 Progate Lv.223
Ruby on RailsⅩⅠ

#概要
 今まで作成したアプリはパスワードが普通の文字列として保存されている。これだと、PCの覗き見やハッキングされデータが盗まれた場合にそのパスワードを使って簡単に他人のアカウントに不正ログインできる。

 →安全性の高いパスワードは万が一覗き見やデータが盗まれてもパスワードの内容がわからない状態である。パスワードを複雑な文字列(暗号化された特殊な文字列)にすることで安全性を高められる。

#Gemfileの編集
 Railsでパスワードを暗号化するときはgem(読み方:「ジェム」)というツールを利用する。gemはRubyやRailsでプログラミングをするときに「よく使う機能」をパッケージ化したものである。様々なgemが存在するが、今回は`bcrypt`という暗号化するためのgemを使う。
 Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。`gem ‘gemの名前’ `と記述する。`rails new`コマンドで生成されたGemfi

gemの種類

#プログラミングの勉強日記
2020年7月26日 Progate Lv.226
Ruby on Rails開発パス終了

#gemとは
 Railsでパスワードを暗号化するときはgem(読み方:「ジェム」)というツールを利用する。gemはRubyやRailsでプログラミングをするときに「よく使う機能」をパッケージ化したものである。様々なgemが存在するが、今回は`bcrypt`という暗号化するためのgemを使う。
 Railsにはインストールしたいgemを記述するGemfileというファイルが存在する。`gem ‘gemの名前’ `と記述する。`rails new`コマンドで生成されたGemfileにはすでにいくつかのgemが書かれてインストールされている。
 `gem ‘gemの名前’, ‘gemのバージョン’ ` とすると、そのバージョンがインストールされる。バージョンを指定しないと、最新のgemがインストールされる。

“`:Gemfile
gem ‘rails’, ‘5.0.3’
gem ‘puma’, ‘3.6.2’

bcryptのインストール
gem ‘bcrypt’

Railsでファイルのアップロード機能を簡単に追加する方法

#プログラミングの勉強日記
2020年7月27日 Progate Lv.226

#概要
 [こちらの記事](https://qiita.com/mzmz__02/items/61423e7259c4624f3010)で扱ったgemのCarrierWave用いる。アップロードしたファイルの保存先はデフォルトでpublic/uploadsになる。
 前提として、`scaffold`のコマンドで作られている。(以下のは例)

“`:ターミナル
rails generate scaffold user name:string email:string image:string
“`

#使い方
 CarrierWaveを使うためにGemfileを編集する

“`:Gemfile
gem ‘carrierwave’
“`

Gemfileを編集したら、CarrierWaveをインストールする。

“`:ターミナル
bundle install
“`

アップローダークラスとカラムの紐づけをする。

“`ruby
class モデル名 < ActiveRecord::Base

rails db:migrateでのエラー

#プログラミングの勉強日記
2020年7月28日 Progate Lv.226
Railsでアプリケーションを作成中

#rails db:migrateを実行したときのエラー
 ターミナルで`rails db:migarate`を実行したときに下記のようなエラーが出てきた。

“`terminal
user@itpro2_ubuntu:~/travel$ rails db:migrate
== 20200727142030 AddUserRefToPost: migrating =================================
— add_reference(:posts, :user, {:foreign_key=>true})
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: user_id: ALTER TABLE “posts”

Railsでhamlを使う

#プログラミングの勉強日記
2020年7月29日 Progate Lv.226

#概要
 [こちらの記事](https://qiita.com/mzmz__02/items/61423e7259c4624f3010)で扱ったgemのhamlを説明する。hamlはHTML Abstraction Markup Languageの略で、簡単にHTMLのコードを書くことができる。erbと同じでRubyのコードを埋め込むこともできる。
 hamlには閉じタグが存在しないので、コードを簡単かつすっきり書くことができる。

#使い方
 hamlを使うためにGemfileを編集する

“`:Gemfile
gem ‘haml-rails’
“`

Gemfileを編集したら、hamlをインストールする。

“`:ターミナル
bundle install
“`

 これで、`index.html.haml`といったビューファイルの拡張子に`haml`を使えるようになる。

##すでにあるerbファイルをhamlファイルに変えたい場合

“`:Gemfile
gem ‘haml-rail

Rails メールアドレス、パスワード+αでログイン認証する

## 目的
nation_nameプロパティをログインに必要な項目に追加する。
## 使い方
– カラムとして存在しないプロパティを追加するattr_accessorメソッドを使ってnation_nameプロパティをユーザーモデルに追加する

“`ruby:user.rb
class User < ApplicationRecord #accessor attr_accessor :nation_name ``` - registration/new.html.erbとsessions/new.html.erbに以下のコードを追記する。 ```ruby :new.html.erb

<%= f.label :国名 %>
<%= f.text_field :nation_name, autofocus: true %>

“`

– パラメーターとして送られるgroup_nameが許可されるようにする

“`ruby
:application.controller
class Appli