見出し画像

基礎編課題9 掲示板作成機能(学習34日目)

1、掲示板作成のテストを追加する ※今回はスキップ
2、Userモデルに、Bulletinモデルとの関連付けを追加
3、routes.rbに、掲示板作成のrouteを追加する
4、掲示板作成のコントローラーを実装する
5、掲示板作成のビューを実装する

今回の課題はさくさくと進めることができた気がする。それでも分からないとこあって調べましたが。
まずはUserモデルに、Bulletinモデルとの関連付けを追加。っていってもすでに終わってました。
そしてルーティングもnewとcreateを追加。

has_many bulletin, dependent: :destroy

これを宣言したら下記のbulletinというメソッドが使用できるようになりアソシエーションを活用して、処理を短く記載することが出来る。そしてストロングパラメータからの受取。これら超大事っす。

@bulletin = current_user.bulletin.build(bulletin_params)

これは下記2つと同じ意味だが、コードをなるべく減らすように書くことを意識する。

@bulletin = BUlletin.new(bulletin_params)
@bulletin.user_id = current_user.id
Bulletin.new(bulletin_params.merge(user_id: current_user.id))

=> アソシエーションで関連しているオブジェクトであることを強調した方が良い

アソシエーションで関連したオブジェクトを初期化する際は、通常の初期化と区別してnewではなくbuildと記載することがる。
ちなみに、buildはnewのエイリアス(別名)のため、どちらで記載しても挙動は変わらない。

 private

 def bulletin_params
   params.require(:bulletin).permit(:title, :body)
 end

ストロングパラメータも追記。

ja:
 defaults:
   login: 'ログイン'
   register: '登録'
   logout: 'ログアウト'
   message:
     require_login: 'ログインしてください'
     created: "%{item}を作成しました"
     not_created: "%{item}を作成できませんでした"

フラッシュメッセージも追記。なるほど!こんな書き方も出来るんですね。

redirect_to bullein_path, success: t('defaults.message.created', item: Bullein.model_name.human)

 else
     flash.now['danger'] = t('defaults.message.not_created', item: Bulletin.model_name.human)
     render :new

viewの実装も前回みたいにrenderで表示させるようにする。
/new.html.erbと/form.html.erbに分けて表示させる。下記のようになる。

<div class="container">
  <div class="row">
    <div class="col-lg-8 offset-lg-2">
      <h1><%= t('.title') %></h1>
      <%= render 'form', { bulletin: @bulletin } %>
    </div>
  </div>
</div>

<%= render 'form', { bulletin: @bulletin } %> => ここでrender 下記を表示。

 <%= form_with model: bulletin, local: true do |f| %>
  <div class="form-group">
    <%= f.label :title %>
    <%= f.text_field :title, class: 'form-control' %>
  </div>
  <div class="form-group">
    <%= f.label :body %>
    <%= f.text_area :body, class: 'form-control', rows: 10 %>
  </div>

  <%= f.submit class: 'btn btn-primary' %>
<% end %>

そもそもform_withの自動付与機能ってなんだっけ?相変わらずform_withは苦手。笑
この記事が分かりやすかった。nameとidを指定していないのに、自動でname属性とid属性が付与されているみたいだ。検証ツールで確認したが確かに付与した場合としていない場合のどちらも確認できた。

<div class="form-group">
   <%= f.label :body %>
   <%= f.text_area :body, class: "form-control", id: "board_body", rows: "10" %>
</div>

ちなみに上記の通りしっかりidについては記入していたので削除しました。

cols: text_areaの文字数 入力欄の幅を文字数で指定
rows: text_areaの行数 入力欄の高さを行数で指定
※textarea の cols, rows はデフォルトでは 40, 20

 <%= f.submit class: 'btn btn-primary' %> => ここも何で登録するボタンが正しく表示されるんだっけ?という疑問。(今更)
i18nでそう表示されるようになるんでした。

#users/new.html.erb

<div class="actions">
  <%= f.submit (t 'defaults.register'), class: "btn btn-primary" %>
</div>
end

昨日の課題でもこうしてしまってたけど、(t 'defaults.register')これんて必要なかったわけですね。。。理解出来てよかった!

ja:
  helpers:
    select:
      prompt: 選択してください
    submit:
      create: 登録する
      submit: 保存する
      update: 更新する

1日に1課題終わらせるのが精一杯だな・・。SQLの勉強も並行してやってるし。SQLドリル終わったら次はRUBYのチェリー本やります。

また明日もしっかり頑張ろ!!

この記事が気に入ったら、サポートをしてみませんか?
気軽にクリエイターの支援と、記事のオススメができます!
某大手製鉄所勤務。6月退職予定。30代からWEBエンジニアへのジョブチェンジに向けて福岡の田舎で奮闘中。さすがにそれは難しいのでは、、、と言われるのは承知ですが、必死に頑張ります😤