オリジナルアプリ作成記 3 ~マイグレーションの追加、記事投稿機能の実装、エラーメッセージの表示~
マイグレーションファイルとテーブルにカラムを追加(references)
まずは、依頼投稿機能(記事投稿)のテーブルに投稿したユーザーのuser_idを追加できるようにマイグレーションファイルを追加した。
$ rails g migration AddUserIdToRequests
できたファイルに以下のように追記
def change
add_reference :requests, :user, foreign_key: true
end
ここでforeign_key: trueのように外部キー制約を行うのを忘れずに。
あとはrails db:migrateでおしまい!
アソシエーション & ストロングパラメーター
次に投稿してみてuser_idがログインしているユーザーで記録されるように実装。
requestモデルとuserモデルの間でアソシエーションを組むことからスタート。
requestモデル => belongs_to :user
userモデル => has_many :requests
ここでrequestsコントローラーのストロングパラメーターに注意する。
注意点は、外部キーを統合させる必要がある点。
merge(user_id: current_user.id)でログイン & 記事投稿したユーザーのidも統合されて記録されるようになる。
current_userはdeviseを導入していることで使えるようになる。
これで記事投稿してみると、requestテーブルに無事記録され、user_idもログインしているユーザーのidが記録されていた。
redirect_to & render
続いて、記事投稿に成功するとTopページへ失敗すると再度記事投稿ページへ戻される機能を実装。
早い話こんな感じ。
特に考察することもなく、テンプレート的な記述。
問題は、renderでエラーメッセージをいかにして表示するか。
レイアウト崩れをどう直すかという点。
明日改めてまとめたいと思う。
今日はおしまい!
ここまで順調に進んでいる気がする!
オリジナルアプリ作成記 2 ~記事投稿ページの作成、ActiveHashでカテゴリーの設定~
眠い目こすりながら今日もアプリ作成です。
仕事のある日は、割と簡単な作業だけにして休みの日にガッツリ進めたい。
今日は、前回準備した記事投稿ページのレイアウトと、ActiveHashを設定。
レイアウトってカッコつけて言ったけども、やはりダセェ。
デザインできる人ってすげぇなって思う。
単に自分がデザインの勉強をしていないだけな気もするけども。
中身はこんな感じ。
埋め込みrubyでcssの設定ってどうするんだろ、って思って調べながら
適当にデザイン。
ここまでは特につまづくことなく。
続いてActiveHash。
まずはGemをインストール。
|
gem 'active_hash'
|
カテゴリーの中身を設定するためのmodelを作成。
マイグレーションファイルは必要ないので、スキップする。
% rails g model category --skip-migration
class Category < ActiveHash::Base self.data = [ { id: 1, name: '--' }, { id: 2, name: '作詞依頼' },こんな感じで設定したいカテゴリーを好きな数だけ追加する。
{ id: 3,........},
] end
class Request < ApplicationRecord extend ActiveHash::Associations::ActiveRecordExtensions belongs_to :category end
include ActiveHash::Associations has_many :requests
オリジナルアプリ作成記 ~トップページ、Userの管理機能、記事投稿機能の準備~
今日からこれまでスクールで学んだことを生かしてオリジナルアプリを作成していく。
目標は1ヶ月で仕上げること!
年末年始の忙しい時期にしてはハードルの高い目標だなと思う。
まずは、レイアウト的な物を作ることにした。
データ設計とかは大雑把だけどもメモ帳にまとめて、とりあえず作ってみることに。
だ、ダセェ…笑
我ながらセンスのないレイアウト、色使い…。
ある意味感動する。絵心はないのは昔からだけども、こういうところにも出るんだなぁ
しかし問題ない。重要なのは機能の面。
今のところ予定では、ContentA(赤)、ContentB(青)、ContentC(黄)の三つがこのアプリのメインの機能になる。
名前は今のところ適当。
それぞれに
「全ユーザーが投稿した依頼のまとめ(記事一覧)」
「依頼投稿機能(新規記事投稿)」
「フォロー、フォロワー間のチャット機能(これは実現できたらいいな程度に)」
html、CSSは見れればいいや程度に適当に編集。
もちろんデザインがしっかりしていればユーザーも使いやすいだろうけど、
とりあえずは機能をしっかり作っていきたい。
余裕があればデザインにも力を入れる。多分ないけど。
次に取り組んだのは、User管理機能。いわゆるログイン、ログアウト、新規作成。
deviseをインストールして、ちょちょいとやるだけの簡単なお仕事。
これはもはやどのアプリを作成する上でも避けられない作業だし、
やることは全部一緒なので、テンプレート的に暗記すればいいかなと思った。
そこまで内容も難しくないしね。
やっぱりダセェ!!
なんか必要最低限の機能を持った物を作ると入ったもののダサすぎる。
でも中央揃えとか頑張ったんや。ちょっとでも見栄えを良くしようと思って。
色って大事だなぁ。
新規登録、ログインして、テーブルに情報が登録されてログアウトできて〜までは
deviseで一通り実装できる。
問題は、ログアウトする際にmethod: :deleteを記述することを忘れずに。
ストロングパラメータに関しても注意が必要。
application_controllerにdeviseに関してのストロングパラメータを書く必要がある。
deviseの処理を行うコントローラーはGemに書かれているためである。
Gemは直接編集することはできないためapplication_controllerに書くという流れ。
deviseを使用して実装を行った場合は、paramsの他に、paramsとは異なった形のパラメーターも受け取っている…らしい。
=> deviseコントローラーにストロングパラメーターを設定する必要がある。
paramsとは異なった形のパラメーターを受け取るように設定する必要がある。
異なった形のパラメーターはdevise_parameter_sanitizerというメソッドを使用する。
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :devise_controller? private def configure_permitted_parameters devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname]) end end
こんな感じ。
ログイン、新規登録をする時などのリクエストからパラメーターを取得することができる。
第一引数に機能、次に許可するカラムを記述する。
今回はnicknameというカラムを後から追加したので、それを新規登録する際に許可するようにしておく。
if: :devise_controller?でdeviseに関する処理のみこれらのメソッドが使用されるようにする。
application_controllerで全体に影響するけど、deviseのみに使用したいのでこのように記述する。
あとは、application.html.erbのヘッダー部分にログインしている時、ログアウトしている時の状態で表示を分ける。
とりあえずユーザー管理機能は実装できたので、次に記事投稿機能の準備だけしておこうと思って取り組み始めた。
とは言っても、モデルを作って、ルーティング設定、コントローラー作成、ビューファイルの作成まで。
コンソールを使って、データを登録して、ビューファイルに表示させるところまでやって…。
今日はここまで!
ボチボチやっていきましょう。