webアプリ制作での注意事項

[決められた期間でappを完成させるために注意すべきこと]

工程数を減らす

特に工程が増えるのはform画面の制作。 何か機能を実装させていくのあたりform画面が増える場合は作業内容がかなり増加することを考慮する。[例:モデル/urlのネスト関係,viewの制作,バリデーションの回数、テスト内容など]

基本的にformにおいて入力項目は必要最低限にする。[例:ログインではemail.passwordのみなど]

ログイン画面でカラムの状態で判断する

[前提]

  • ログイン画面ではemail.passwordを使用している
  • member:モデル使用してdeviseでユーザ機能を実装
  • member_status:カラム:boolea型:default:false[会員登録状態]:true[退会済]
  • falseならログイン:trueならログイン出来ないようにする

[ポイント]

  • session/newではemail.passwordしか用いてないのでparamsではemail.passwordしか使えない=>emailを用いてレコードを取得してそれがパスワードを一致するか・member_statsuの状態をチェックする

  • devise superの記述はそのまま使用する

[コード]

def create
   # emailを受け取る処理/emailカラムで検索するのでfind_byメソッドを用いる.またemailだとカラム名重複する場合があるので何モデルかも示すように指定する。.doencaseは大文字を小文字に変換するメソッド
  @member = Member.find_by(email: params[:member][:email].downcase)
  # emailで存在しているか調べる
  if @member
    #valid_password?で引数で受け取った値が@memberでも有効か検証し、同時に@memberのmember_statusがture[退会済み]か確認する
      if (@member.valid_password?(params[:member][:password]) && (@member.member_status == true))
      #もし両方の条件がtrueだった場合
        flash[:error] = "退会済みです。"
        redirect_to new_member_session_path
      else
     # もしtrueでなかった場合
        super
      end
#emailで検索した際にレコード自体を持って来れなかった場合
  else
      flash[:error] = "必須項目を入力してください。"
      redirect_to new_member_session_path
  end
end

[大事]

- 先にどのような条件で分岐させたいか洗い出す - emailでまずレコードを取得する

ログイン・ログアウト後のリダイレクト先を指定する[devise]

[前提]

  • deviseを使用しユーザー機能を実装している
  • Admin / Memberモデルを使用している
  • 今回はそれぞれのログイン・ログアウト後のリダイレクト先を指定する
  • またそれぞれのモデルのurlやコントローラをわかりやすい形にするため階層構造にしている [get "admins/secction/new" => "admins/admins#new"]

    [注意]

    今まで一つのモデルを用いていたが、複数モデルを扱う際リダイレクト先を指定したくなった。

[今までの方法]

private
def after_sign_in_path_for(resoure)
    root_path
end

[考え方] in_application.controllerに記載する。処理の条件を記載する。

private
def after_sign_in_path_for(resource_or_scope)
    if resource_or_scope.is_a?(Admin)
        admins_orders_top_path
    else
        root_path
    end
end

def
after_sign_out_path_for(resource_or_scope)
    if resource_or_scope == :member
        root_path
    elsif resource_or_scope == :admin
        new_admin_session_path
    else
        root_path
    end
end

ラジオボタンの実装

[前提]

入力フォームのviewを弄るので、modelやcontrollerなどは既に作成してある状態であること

  • 入力フォームでの作業

- 使うテーブルはマスタ項目などでパターンが2つでユーザーのアクションなどで頻繁に増えないことが条件[3つになるとこれは使え無い]

[記法]

<%= form_for(@user) do |f| %>

    <label><%= f.radio_button :カラム名, "カラムに追加する値" %>選択肢の文字<label>

<% end %>

参照

ER図作成時の注意点

[テーブルの整理(各テーブルのレコードの整理)・別テーブルやカラムに対しての考え方]

  • 「繰り返し項目を削除する」そのカラムがアクターのアクションによって増えるか

    [特に、毎回増加するか(会員のテーブルは増加するが頻度は高くない。投稿については利用者の悪所によって毎度作成される)]、増加する場合は別テーブルにしてそちらを子テーブル、切り離した元のテーブルを親テーブルと考える。

  • 「外部キーで置き換える」関連づけた場合どちらかに影響してもシステムの使用上問題がないか考慮する。

    [注文テーブルなどは注文した後に関連づけたテーブルでの値の変化を受け付けたくないので、カラムを別テーブルに分けず自分のテーブルにカラムを作成する] [ユーザーテーブルなどは会員情報・名前などの変更が後から存在する可能性があるので別テーブルに行う]

    • 登録した情報を修正するか

    • 頻度は高くないが増えるか[会員登録などで]

    - 同姓同名を区別したいか

  • 「マスタ項目を分割する」

  • そのカラムの情報はある程度決まったパターンのみか

  • そのパターンをあとで追加・修正する可能性があるか

  • パターンがレコードごとにわかりやすい形で表したいか

[商品のジャンルは、ある程度決まっており追加修正の可能性がある]

[注意]

関連づけたテーブルから値を持ってくる場合

  • どっちかが消えると消える

  • どっちかのdateが変更すると引っ張ってくるほうも変化する

その2点でテーブルやカラムをチェックしてそれで良いか確かめる

新規登録する際に

別テーブルからdateを引っ張ってくる

=>

① どっちかが消えると消える

② どっちかのdateが変更すると引っ張ってくるほうも変化する

=>

注文「table dbに保存する」→ きっちり形を残す 紙に描いて残すイメージ

viewなどでそのテーブルでカラムを記載する

ユースケースとは

[何]

  • システムを大雑把に示したもの

  • 利用者とそこでの動作に着目して作る

[種類]

[用途]

app開発において

要件定義=>ユースケース=>DB設計[ER図=>テーブル設計] 画面設計[UI Flow=>ワイヤーフレーム]

ER図において作業が行き詰まる場合

要件からエンティティや属性を洗い出すがその際に

[何が必要か?] [それぞれのエンティティはどのように関係しているのか?]

がはっきり意識できない場合、製作者のシステムに対する認識を明確する

[どのような作業するシステムを作りたいのか?など]

db設計/ER図設計でのツール

ER図とは


db設計の手法の一つ。dbが必要なソフトウェアを開発する際は必ず用いる。様々な記法が存在しIE記法などが存在する。

IE記法とは


関係[リレーション]と関連の多重度を示す。アイソレーションを表す記号。ER図でも使用されている。

記号 意味
0(ゼロ)
l 1(イチ)
(鳥の足)

db設計時の便利なツール