--- robots: noindex, nofollow --- # Railsで日記サービスを作ろう! ## 機能 ・ユーザー登録 ・ログイン ・ログアウト ・日記登録 ・日記一覧 ・日記編集 ・日記削除 ## 1. 日記modelを作ろう! ### 1.1 命名規則 テーブル名:users モデル名/クラス名:User ファイル名:user.rb - 単語が複数組み合わさる場合 テーブル名:line_items モデル名/クラス名:LineItem ファイル名:line_item.rb https://qiita.com/gakkie/items/3afcd505c786364aa5fa https://qiita.com/tfrcm/items/80625a75959591c2b7cd ### 1.2 modelの作り方 ```bash= bin/rails g model Diary title:string description:text ``` gコマンドでモデルを作成すると * モデルのソースコード * マイグレーションファイル * モデルの自動テスト * 自動テスト用のデータ定義ファイル の4ファイルが自動生成される。 #### その他、migrationコマンド https://qiita.com/zaru/items/cde2c46b6126867a1a64 #### migrateを使ったテーブルやカラムの変更、追加、削除コマンド一覧 https://qiita.com/azusanakano/items/a2847e4e582b9a627e3a https://qiita.com/zaru/items/cde2c46b6126867a1a64 ### 1.3 dbをmigrateする ```bash= bin/rails db:migrate ``` ### 1.4 migrationとは? マイグレーションとは、データベースへの変更をフレームワーク上で管理(ファイルとして)しておく機能。 ソースとしてバージョンを管理することで、DBに手を加えて何か不具合が起こったりした時でも前日のDBの状態にすぐ戻せたり、何ヶ月前のデータベースの状態に戻すこともできる。 phpMyAdminで手でDBを変更していると「間違えた」といった時でも、前の状態を記憶して覚えていないと戻せない。(実際にはDBのカラム追加や削除など何か変更を加える前には、必ずDBの情報をエクスポート(ダンプファイルと呼ぶ)して取っておくのが一般的 ### 1.5 migrationの使い方 指定バージョンに戻す ```bash= bin/rails db:migrate VERSION=20190428XXXXX ``` ※マイグレーションファイルの先頭の日時を指定する ○ロールバックする ```bash= bin/rails db:rollback ``` stepを指定して、何個か前の状態に戻す場合 ```bash= bin/rails db:rollback STEP=5 ``` ※必ずマイグレーションファイルを作ったら、ロールバックできるか確認すること!! ## 2. 日記コントローラを作ろう! ### 2.1 命名規則 コントローラ名:users コントローラクラス名:UsersController ファイル名:users_controller.rb - 単語が複数組み合わさる場合 コントローラ名:SalesPoint コントローラクラス名:SalesPointController ファイル名:sales_point_controller.rb ### 2.2 コントローラの作り方 まずは、URL、メソッド、アクションを考える。 | URL | HTTPメソッド | アクション名 | 機能名 | 役割 | |:-----------|:------------:|:------------:|:------------:|:------------:| | /diaries | GET | index | 一覧表示画面 | 全ての日記を表示する | | /diaries/new | GET | new | 新規登録画面 | 日記の新規登録画面を表示する | | /diaries | POST | create | 新規登録 | 日記を新規登録する | | /diaries/1 | GET | show | 詳細表示画面 | 該当の日記の詳細を表示する | | /diaries/1/edit | GET | edit | 編集画面 | 該当の日記の編集画面を表示 | | /diaries/1 | PATCH,PUT | update | 更新 | 該当の日記を更新する | | /diaries/1 | DELETE | destroy | 削除 | 該当の日記を削除する | URLとHTTPメソッドから、そのリクエストを処理するコントローラとアクションに振り分ける。(ルーティング) 上記URLとメソッドの決め方を「REST」といい、railsはその「REST」という設計思想に沿ったRESTfulなフレームワーク。 「RESTful」とはRESTの設計思想に従ってるよ〜って意味。 「RESTfulなAPI」「RESTfulなサービス」「RESTfulなフレームワーク」とかって言い方をする。 ### 2.3 RESTとは? RESTの設計ルール。 ``` ・アドレス指定可能なURIで公開されていること ・インターフェース(HTTPメソッドの利用)の統一がされていること ・ステートレスであること(セッションやクッキーを使って状態管理しない) ・処理結果がHTTPステータスコードで通知されること ``` 要は、「何を管理するか(リソース)」を洗い出して決め、「そのリソースをどうしたいか」を決め、「そのためのURI(エンドポイント)」を決めようよ。ってこと。 (ざっくり言えば、URI版の命名規則みたいなもん) https://developer.mozilla.org/ja/docs/Web/HTTP/Methods ### 2.4 ダメなURI設計例 #### やりたい事 ユーザーを登録したい(サーバーへブラウザで入力したユーザー情報を渡し、ユーザーを新規登録したい) #### URIとHTTPメソッド ダメなパターン ``` GET /addusers?name=kazukichi&password=aiueo ``` 良いパターン ``` POST /users/add ``` ``` POST /users/new ``` #### やりたい事 ある日記を表示(取得)したい(サーバーから、ある日記情報を取得したい) #### 実際のURIとHTTPメソッド ダメなパターン ``` POST /adddiary?user_id=15 ``` 良いパターン ``` GET /diaries/15/ ``` https://qiita.com/NagaokaKenichi/items/6298eb8960570c7ad2e9 ### 2.5 コントローラの作り方 コントローラをgコマンドで作るとviewも一緒に作られるので、GETメソッドのものを引数のアクション名にするといい ```bash= bin/rails g controller コントローラ名 アクション名 アクション名... オプション ``` ```bash= bin/rails g controller diaries index show new edit ``` ### 2.6 ルーティングの設定方法 URLとHTTPメソッドから、そのリクエストを処理するコントローラとアクションに振り分けるか(ルーティング)をroutes.rbで設定する。 ```ruby= get 'diaries/index' get 'diaries/show' get 'diaries/new' get 'diaries/edit' ``` だとやりたいURIと振り分けるメソッドが違う&足りないため、 ```ruby= get 'diaries', to: 'diaries#index' get 'diaries/new', to: 'diaries#new' post 'diaries', to: 'diaries#create' get 'diaries/:id', to: 'diaries#show' get 'diaries/:id/edit', to: 'diaries#edit' put 'diaries/:id', to: 'diaries#update' patch 'diaries/:id', to: 'diaries#update' delete 'diaries/:id', to: 'diaries#destroy' ``` としてあげる。 でも、決まったアクションの命名規則とURI(エンドポイント)のルーティングであれば ```ruby= resources :diaries ``` という1行で済んでしまう。 さらにルートを設定しておく。 ```ruby= resources :diaries root to: 'diaries#index' ``` ### 2.7 既存のルーティングを見たい場合。 ```bash= rake routes ``` ### 2.8 テンプレートエンジンのslimを使ってみよう! rubyのテンプレートエンジンにはerb、haml、slimがある。 erbはphpに似た形。 hamlとslimはsassに似たような記法になる。 slimはhamlとほぼ同じ書き方だがタグの先頭の%を省略できる。 http://toyokappa.hatenablog.com/entry/2017/09/10/231346 Gemfileに下記gemを追記。 slim-railsはslimのテンプレートエンジン自体。html2slimはerb形式をslimに変換するコマンドが使えるようになるもの。 ```bash= gem 'slim-rails' gem 'html2slim' ``` あとは ```bash= bundle ``` もしくは ```bash= bundle install ``` でインストール。どちらも同じコマンド。 また、既に存在するerbファイルは変換されないので、手動で変換しておく。 bundleから「erb2slim」のコマンドを叩く。 ```bash= bundle exec erb2slim app/views/ --delete ``` サーバーを再起動する(slimが読み込まれず、エラーになる) ```bash= bin/rails s ``` ### 2.9 コントローラの実装 #### 2.9.1 新規登録画面 ```ruby= class DiariesController < ApplicationController def index end def show end def new @diary = Diary.new end def create @diary = Diary.new(diary_params) if @diary.save redirect_to '/', notice: "日記「#{@diary.title}」を登録しました。" else # 登録フォームを再度呼び出す @diaryというインスタンス変数に入れておけば、newアクションでも使い回せるので、エラーになっても入力内容が保持されたままになる render :new end # デフォルトでは、noticeとalertがある。add_flash_typesで増やせる # flash[:notice] = "日記「#{diary.name}」を登録しました。" # redirect_to diary_url # # このリクエスト内ですぐ使いたい場合はnowを使う # flash.now[:notice] = "日記「#{diary.name}」を登録しました。" end def edit end private def diary_params # {diary: {...}} のデータ形式で送られてきていて、かつnameとdescriptionだけを抜き出す params.require(:diary).permit(:title, :description) end end ``` ```ruby= h1.c-page_title 日記登録 = link_to '一覧', diaries_path, class: 'c-link' = form_with model: @diary, local: true, html: { class: 'c-form' } do |f| = f.label :title, class: 'c-form__label' = f.text_field :title, class: 'c-form__text' = f.label :description, class: 'c-form__label' = f.text_area :description, class: 'c-form__textarea' = f.submit nil, class: 'c-btn c-btn--success' ``` 通知を表示させるため、共通のテンプレートに下記を記述。 layouts/applications.html.slim ```ruby= doctype html html ... body - if flash.notice.present? .c-alert.c-alert--success= flash.notice = yield ``` #### 2.9.2 一覧表示画面 ```ruby= class DiariesController < ApplicationController def index @diaries = Diary.all end ... end ``` ```ruby= h1.c-page_title 日記一覧 = link_to '日記の登録', new_diary_path, class: 'c-btn' table.c-table tbody.c-table__body - @diaries.each do |diary| tr.c-table__tr td.c-table__td = link_to diary.title, diary, class: 'c-link' / この書き方でも同じ td= link_to diary.title, diary_path(diary) td.c-table__td = diary.created_at ``` #### 2.9.3 日記詳細画面 ```ruby= class DiariesController < ApplicationController ... def show @diary = Diary.find(params[:id]) end ... end ``` ```ruby= h1.c-page_title = @diary.title p.c-text_section = simple_format(@diary.description) /simple_format は改行ごとにpタグで囲ってくれ、一部の危険なhtmlタグを取り除いてくれる ``` index.html.slim #### 2.9.4 編集画面 ```ruby= class DiariesController < ApplicationController ... def edit @diary = Diary.find(params[:id]) end def update diary = Diary.find(params[:id]) diary.update!(diary_params) redirect_to root_path, notice: "日記「#{diary.title}」を編集しました。" end ... end ``` edit.html.slim ```ruby= h1.c-page_title 日記編集 = link_to '一覧', diaries_path, class: 'c-link' = form_with model: @diary, local: true, html: { class: 'c-form' } do |f| = f.label :title, class: 'c-form__label' = f.text_field :title, class: 'c-form__text' = f.label :description, class: 'c-form__label' = f.text_area :description, class: 'c-form__textarea' = f.submit nil, class: 'c-btn c-btn--success' ``` index.html.slim ```ruby= h1.c-page_title 日記一覧 = link_to '日記の登録', new_diary_path, class: 'c-btn' table.c-table tbody.c-table__body - @diaries.each do |diary| tr.c-table__tr td.c-table__td = link_to diary.title, diary, class: 'c-link' / この書き方でも同じ td= link_to diary.title, diary_path(diary) td.c-table__td = diary.created_at td.c-table__td = link_to '編集', edit_diary_path(diary) ``` #### 2.9.5 削除 ```ruby= class DiariesController < ApplicationController ... def destroy diary = Diary.find(params[:id]) diary.destroy redirect_to root_path, notice: "日記「#{diary.title}」を削除しました。" end ... end ``` index.html.slim ```ruby= h1.c-page_title 日記一覧 = link_to '日記の登録', new_diary_path, class: 'c-btn' table.c-table tbody.c-table__body - @diaries.each do |diary| tr.c-table__tr td.c-table__td = link_to diary.title, diary, class: 'c-link' / この書き方でも同じ td= link_to diary.title, diary_path(diary) td.c-table__td = diary.created_at td.c-table__td = link_to '編集', edit_diary_path(diary), class: 'c-btn c-btn--warning' td.c-table__td = link_to '削除', diary, method: :delete, data: { confirm: "日記「#{diary.title}」を削除します。いいですか?" }, class: 'c-btn c-btn--danger' ``` ## 3. ユーザー登録機能を作ろう! ### 3.1 モデルとDBの作成 テーブル名:Users | 名前 | カラム名 | データ型 | |:-----------|:------------:|:------------:| | ユーザーID | id | Integer | | ユーザー名 | username | String | | メールアドレス | email | String | | パスワード | password_digest | String | | 作成日 | created_at | Datetime | | 更新日 | updated_at | Timestamp | ※password_digestはrailsのhas_secure_passwordという機能を使うための決まったカラム名 ```bash: bin/rails g model Users username:string email:string password_digest:string ``` マイグレーションファイルを修正する ```ruby= t.string :username, null: false ... t.index :email, unique: true ``` ### 3.2 has_secure_passwordを使えるようにする has_secure_passwordを使うにはbcryptのgemをインストールする必要がある ```ruby= # Use ActiveModel has_secure_password gem 'bcrypt', '~> 3.1.7' ``` model/users.rbに1行追記 ```ruby= class User < ApplicationRecord has_secure_password end ``` has_secure_passwordを使うとモデルにpasswordとpassword_confirmationが追加される。 ※gemをインストールしたらサーバー再起動を忘れずに!! ### 3.3 コントローラとビュー作成のためのURLとアクションの対応表を作成 | URL | HTTPメソッド | アクション名 | 機能名 | 役割 | |:-----------|:------------:|:------------:|:------------:|:------------:| | /users | GET | index | 一覧表示画面 | 全てのユーザーを表示する | | /users/new | GET | new | 新規登録画面 | ユーザーの新規登録画面を表示する | | /users | POST | create | 新規登録 | ユーザーを新規登録する | | /users/1 | GET | show | 詳細表示画面 | 該当のユーザーの詳細を表示する | | /users/1/edit | GET | edit | 編集画面 | 該当のユーザーの編集画面を表示 | | /users/1 | PATCH,PUT | update | 更新 | 該当のユーザーを更新する | | /users/1 | DELETE | destroy | 削除 | 該当のユーザーを削除する | ※今回は「ユーザー登録機能」だけを使うため、newアクションとcreateアクションのみ作成する ※「ユーザー一覧」は通常、管理者がユーザーを管理する場合に管理画面から見る際に使用する機能(その場合、URLも``/admin/users``の方がいい) ### 3.4 対応表に基づいて、コントローラとビューを作成 ```bash= bin/rails g controller users new ``` ### 3.5 新規登録のコントローラとビューを実装 newとcreateメソッドを実装する。 ```ruby= class UsersController < ApplicationController def new @user = User.new end def create @user = User.new(user_params) if @user.save redirect_to root_path, notice: "ユーザー登録しました!!" else render :new end end private def user_params params.require(:user).permit(:email, :password, :password_confirmation) end end ``` users/new.html.slim ```ruby= h1.c-page_title ユーザー登録 = form_with model: @user, local: true, html: { class: 'c-form' } do |f| = f.label :email, class: 'c-form__label' = f.text_field :email, class: 'c-form__text' = f.label :password, class: 'c-form__label' = f.password_field :password, class: 'c-form__text' = f.label :password_confirmation, class: 'c-form__label' = f.password_field :password_confirmation, class: 'c-form__text' = f.submit nil, class: 'c-btn c-btn--success' ``` diaries/index.html.slim ```ruby= header = link_to 'ユーザー登録', new_user_path = link_to 'ログイン', login_path = link_to 'ログアウト', logout_path, method: :delete h1.c-page_title 日記一覧 ... ``` ## 4. ログイン機能を作ろう! ### 4.1 モデルとDBの作成 モデルはUserモデルを使うだけなので、必要ない。 ### 4.2 URLとアクションの対応表を作成 コントローラ名:Authorizations | URL | HTTPメソッド | アクション名 | 機能名 | 役割 | |:-----------|:------------:|:------------:|:------------:|:------------:| | /login | GET | new | ログイン表示 | ログイン画面を表示する | | /login | POST | create | ログイン | ログインする | | /logout | DELETE | destroy | ログアウト | ログアウトする | ※Auth(authorization)かSessionの名前を使うことが多い。RESTではそういったものを「リソース」なんて言い方をする。「AuthリソースやSessionリソースをnew(発行)したり、削除(destroy)するためのコントローラ」という事でAuthコントローラやSessionコントローラという命名をする。 ### 4.3 対応表に基づいて、コントローラとビューを作成 ```bash= bin/rails g controller authorizations new ``` ### 4.4 ルーティング設定 urlに対応するコントローラとアクションを設定する ```ruby= get '/login', to: 'authorizations#new' post '/login', to: 'authorizations#create' post '/logout', to: 'authorizations#destroy' ``` ### 4.5 ログインのビューとコントローラを実装 ```ruby: class AuthorizationsController < ApplicationController def new end def create user = User.find_by(email: authorization_params[:email]) if user&.authenticate(authorization_params[:password]) session[:user_id] = user.id redirect_to root_path, notice: "ログインしました" else render :new end end private def authorization_params params.require(:authorization).permit(:email, :password) end end ``` authorizations/new.html.slim ```ruby= h1.c-page_title ログイン = form_with scope: :authorization, local: true, html: { class: 'c-form' } do |f| = f.label :email, class: 'c-form__label' = f.text_field :email, class: 'c-form__text' = f.label :password, class: 'c-form__label' = f.password_field :password, class: 'c-form__text' = f.submit 'ログインする', class: 'c-btn c-btn--success' ``` diaries/index.html.slim ```ruby= header = link_to 'ユーザー登録', new_user_path = link_to 'ログイン', login_path - if current_user && current_user.email span ようこそ、#{current_user.email}さん。 h1.c-page_title 日記一覧 ... ``` ## 5. ログアウト機能を作ろう! ### 5.1 ビューとコントローラを実装 ```ruby: class AuthorizationsController < ApplicationController ... def destroy session.delete(:user_id) # 全部消したい場合 # reset_sesion redirect_to root_path, notice: "ログアウトしました" end private ... end ``` diaries/index.html.slim ```ruby= header, class: 'c-header' = link_to 'ユーザー登録', new_user_path, class: 'c-header__nav' = link_to 'ログイン', login_path, class: 'c-header__nav' = link_to 'ログアウト', logout_path, method: :delete, class: 'c-header__nav' - if current_user && current_user.email, class: 'c-header__nav' span ようこそ、#{current_user.email}さん。 h1.c-page_title 日記一覧 ... ``` ## 6. どこからでもユーザー情報が取得できるようにする ApplicationControllerに下記を記述 ```ruby= class ApplicationController < ActionController::Base helper_method :current_user # ヘルパーメソッドを定義することで全てのビューから使える private # コントローラー共通で使える def current_user @current_user ||= User.find_by(id: session[:user_id]) if session[:user_id] end end ``` ## 7. ログインしてないと日記を見れないようにする ```ruby= class DiariesController < ApplicationController before_action :login_required #... private # ログインしていなければ、ログイン画面にリダイレクトさせる def login_required redirect_to login_path unless current_user end end ``` ## 8. ログインしたら自分の日記を見れるようにする ### 8.1 Diaryモデルを変更する #### 8.1.1 適当な名前をつけてマイグレーションファイル作成 ```bash= bin/rails g migration AddUserIdToDiaries ``` #### 8.1.2 マイグレーションファイル内容を変更 ```ruby= class AddUserIdToDiaries < ActiveRecord::Migration[5.2] # changeメソッド以外に、up/downメソッドというものがある # upで実際に変更されるものを定義。downはrollback用のもの。 # downも書いて元に戻るようにしておかないと、正しくrollbackが出来なくなってしまうの注意 # changeメソッドはupの内容だけ書いておけば、勝手にrollback時にdownで本来書いておく処理を推測して実行してくれる # 但し、changeではrollback出来ないケースもあるので注意 # http://tanihiro.hatenablog.com/entry/2014/01/10/182122 # 今回は外部キーとしてuser_idをDiariesテーブルに持たせるだけなのでchangeでもいい def up execute 'DELETE FROM diaries;' # add_reference テーブル名, リファレンス名 [, オプション] add_reference :diaries, :user, foreign_key: true, null: false, index: true end def down remove_foreign_key :diaries, :users # remove_reference テーブル名, リファレンス名 [, オプション] remove_reference :diaries, :user, index: true end # def change # execute 'DELETE FROM diaries;' # add_column :diaries, :user, null: false, index: true # end end ``` あとは実行。 ### 8.2 モデル同士の関連性を設定 models/diary.rb ```ruby= class Diary < ApplicationRecord ... # diary.userという形でデータを取得できる。単数系なことに注意。 belongs_to :user private ... end ``` models/user.rb ```ruby= class User < ApplicationRecord has_secure_password # user.diariesという形でデータを取得できる。複数系なことに注意。 has_many :diaries end ``` ### 8.3 ログインしているユーザーの日記情報だけを表示させる ```ruby= class DiariesController < ApplicationController before_action :login_required def index # @diaries = Diary.all @diaries = current_user.diaries end def show # @diary = Diary.find(params[:id]) @diary = current_user.diaries.find(params[:id]) end def new @diary = Diary.new end def create # @diary = Diary.new(diary_params) @diary = current_user.diaries.new(diary_params) if @diary.save redirect_to '/', notice: "日記「#{@diary.title}」を登録しました。" else # 登録フォームを再度呼び出す @diaryというインスタンス変数に入れておけば、newアクションでも使い回せるので、エラーになっても入力内容が保持されたままになる render :new end end def edit # @diary = Diary.find(params[:id]) @diary = current_user.diaries.find(params[:id]) end ... end ``` ## 9. ビューをテンプレート化しよう! views/diaries/new.html.slim ```ruby= = link_to '一覧', diaries_path, class: 'btn' / railsの「パーシャル」という機能を使ってテンプレート化させることができる = render partial: 'form', locals: { diary: @diary } / = form_with model: @diary, local: true do |f| / = f.label :title / = f.text_field :title / = f.label :description / = f.text_area :description / = f.submit nil, class: 'btn' ``` views/diaries/_form.html.slim ```ruby= - if diary.errors.present? - diary.errors.full_messages.each do |msg| p= msg = form_with model: diary, local: true do |f| = f.label :title = f.text_field :title = f.label :description = f.text_area :description = f.submit nil, class: 'btn' ``` ## 10. railsのエラーメッセージや各種表記を日本語化する ### 10.1 エラーメッセージの日本語化 エラーメッセージの日本語化するには、rails-i18nというgemを使用する。 Gemfileに以下の一文を追加して、bundle installする。 ```bash= gem 'rails-i18n' ``` 次に、``config/application.rb``に以下の一文を追記し、サーバ再起動。 ```ruby= config.i18n.default_locale = :ja ``` ### 10.2 カラム名の日本語化 modelの属性名は、日本語変換用のymlファイルを作る必要がある。``config/locales/models/``に、ja.ymlというファイルを作成し、以下のようにカラム名と日本語の対応表を記述する。 ```yaml= ja: activerecord: models: event: イベント attributes: event: name: イベント名 place: 開催場所 content: イベント内容 ``` 最後に、``config/application.rb``にこのymlファイルの読み込む一文を追記すればOK。 ```ruby= config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.yml').to_s] ``` ※正規表現でconfig/locales以下のディレクトリ内にある全てのymlファイルを読み込むように指示している ### 10.3 updated_atを日本時間で表示する config/application.rbファイルに、以下を記述する。 ```ruby= config.time_zone = 'Tokyo' ``` サーバー再起動し、あとはビュー側で ```ruby= ***.created_at.strftime("%Y-%m-%d %H:%M") ``` とフォーマットを指定するだけ。 ## 11. バリデーションをする Model内で決まった指定をどんどん並べて行くだけで、サーバーへ送信された際に自動でバリデーションしてくれる ```ruby= class Diary < ApplicationRecord # validates バリデーション対象のカラム名, させたいバリデーション名: 値(trueとかfalseとか数値とか) # 必須項目チェック validates :title, presence: true # 最大値チェック validates :title, maximum: 50 ... ... end ``` https://qiita.com/shunhikita/items/772b81a1cc066e67930e ### その他 ## mysql起動でエラーが出る場合 https://qiita.com/mogetarou/items/e34ca51d3756d55d7800 ## rails s ですでにプロセスが使われている時 https://qiita.com/motty93/items/d22c1eb8f5128f8cd7f8 rails系コマンドの前には必ず bundle exec をつけること #### bundle installの時はパスを指定した方がプロジェクト毎に管理できるのでよい bundle install --path vendor/bundler #### gemのbootstrapを使う場合 https://qiita.com/NaokiIshimura/items/c8db09daefff5c11dadf 環境構築したら、サーバー再起動しないとエラーが出る https://qiita.com/saicologic/items/bf406d597a8b969c3a60 #### railsでsassを使う場合 基本、railsは自動でコンパイルしてくれるのでassets/stylesheets/配下に.scssを置いておくだけでOK https://qiita.com/masarufuruya/items/d6125332cc3394b5177c ##### railsのcssの書き方(マニフェストファイル) https://qiita.com/samurairunner/items/da22eddb64e867b4e145 #### railsでvueを使う場合 https://qiita.com/cohki0305/items/582c0f5ed0750e60c951 https://qiita.com/347lionz/items/1d677cee82a2954bd7bd webpack-dev-serverを立ち上げる時に `/Users/kimrion/Documents/project/kamitter/vendor/bundler/ruby/2.4.0/bundler/gems/webpacker-48d9fd52c3e9/package.json` のdependenciesを `/Users/kimrion/Documents/project/kamitter/package.json` に追記しないと moduleないよと怒られるので注意! あとwebpackは3系じゃないと `TypeError: dep.getResourceIdentifier is not a function` ってエラーが出る。 #### railsで日付フォーマットを変更したい場合 railsのlヘルパーを使って、i18nのフォーマットの書式が指定できる https://qiita.com/cyborg__ninja/items/446506f60648e3e51c2c ## sessionの中身を表示 <%= session.to_hash %> ```:json { "session_id"=>"0ef98af3d7bfad1b36ab3f3cf1335ec3", "_csrf_token"=>"a/ebBtyxUHuPdppSgePfAx6D7XWym2PMM9CYn3wSFvI=", "warden.user.user.key"=>[[2], "$2a$11$7nYjaoylf9tN1Ti1t/Q4Ae"], "flash"=>{"discard"=>[], "flashes"=>{"notice"=>"ログインしました"}}, "oauth"=>{"twitter"=>{"callback_confirmed"=>true}}, "user_id"=>1 } ``` ## エラーの対処法 ### brew doctorでエラーが出た場合 https://qiita.com/biohuns/items/0fc735257f4ebd34abd7 ### bin/rails db:create で下記エラーが出た場合 ``` /Users/kimrion/.rbenv/versions/2.3.7/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- bundler/setup (LoadError) from /Users/kimrion/.rbenv/versions/2.3.7/lib/ruby/2.3.0/rubygems/core_ext/kernel_require.rb:55:in `require' from /Users/kimrion/Desktop/RoR/sample_app/config/boot.rb:3:in `<top (required)>' from bin/rails:3:in `require_relative' from bin/rails:3:in `<main>' ``` bundlerがinstallできていないので、 ``` gem install bundler bundle install ``` をする。 それでもダメなら ``` bin/bundle install ``` をする。