2021/1/9~2021/1/15

 

 今回の内容

 

 

・furimaアプリについて

furimaアプリは最終チェックをしてもらった結果、特に修正もなく完成した。

 

・今後やること

・furimaアプリの追加実装

・個人アプリの開発

・就活準備

rubyの復習

 

・個人アプリについて

個人アプリは今のところ2つ考えていて

1つ目の案は「確率を使った勝率予測アプリの開発」

2つ目の案は「壁紙張り替え業務のWEBページ作成」

 完成期限を2月3日にしたいので2つ同時に進めるのは難しい

 

 

 

感想

 

 予定よりは時間がかかってしまったが、とりあえずはfurimaアプリが完成して良かった。

 

ここまでが練習でここからの個人アプリ、追加実装が大事なのでさらに努力していきたい

 

2021/1/6~2021/1/8

 

 今回の内容

 

 

・商品購入機能の実装

 

・テストコードの実装

 tokenのテストコードの書き方がよく理解できていなかった

 

・DB保存処理修正

データを確認したところ購入した際にDBに保存されていなかった

createアクションでbinding.pryをしたところidが送られておらず、permit:falseとなっていた

createアクションではデータがない場合でもからのデータとして送信されてしまう

create!とすることでデータがない時はエラー表示することができる

フォームオブジェクトの理解が足らない

 

・購入済み商品表示の変更

sold_outの表示ができるようにif文を記述

<%# 商品が売れている場合は、sold outを表示しましょう %>
<% if @item.order.present? %>
<div class='sold-out'>
<span>Sold Out!!</span>
</div>
<% end %>
<%# //商品が売れている場合は、sold outを表示しましょう %>

itemsテーブルにorder_idというカラムはないのでitemsテーブルから引用はできないと思っていたが、アソシエーションができていれば「.”アソシエーションの形”」で記述できる。

存在するかしないかで条件分岐させたかったので.prezent?をしようした

 

購入機能が完成したのでコードレビューしたところ初めて1発でLGTMがもらえた

 

変更をデプロイしたところDBにアクセスする画面でエラーが発生

DB内のカラムを変更した部分がgit push heroku master をしてもうまく読み込まれなかった。

heroku run rails db:migrate:reset DISABLE_DATABASE_ENVIRONMENT_CHECK=1

でDBを何回かリセットした結果解決した

 

どこでエラーが起きているかを

heroku logs --tail     

で調べ、その対応をしていくことで解消できた

 

 

これで達成要件は完成なので最終チェックをしてもらう 

 

 

 

感想

 

 今回はメンターさんに質問して解決したが今後は自分でこのようなエラーを解決できるようにしなければならない

そのためにも質問できるうちに多くのエラーを体験して経験することが大切

2021/1/4~2021/1/5

 今回の内容

 

 

・商品購入機能の実装

・クレジットカード購入機能の実装

jsを使用してクレジットカードで購入ができるようにする

クレジット機能はDBには保存しない

秘密鍵、公開鍵は環境変数を設定する

公開鍵を設定した際エラーが発生した。

今回のエラーはコードは間違ってなかったがクレジットカードのトークンが読み込まれないエラーだった

メンターさんに質問したがなかなか解決できず、30分くらいかかりキャッシュを削除することでエラーが解決できた

 

 

 

感想

 あと少しで完成できそう

テストコードと細かいところを明日直し、コードレビューまでいきたい

 

今回のエラーはコードが間違ってない、PCのキャッシュが原因のエラーだった。今後個人アプリ等でこのエラーが出た場合、気づけない可能性が高い。ターミナルやアプリの再立ち上げ、キャッシュの削除、この辺りもエラーの原因になることがわかった。

 

2020/12/21~2020/12/27

 

 今回の内容

 

 

・商品購入機能の実装

・購入のためのフォーム実装

カード情報と住所情報をのフォームのリンクが

<%= form_with url: item_orders_path, model: @order_address, id: 'charge-form', class: 'transaction-form-wrap',local: true do |f| %>

このように書かないとうまくリンクしなかった

今まではmodelかurlどちらかだけだったが

なぜ両方必要かわからなかった

仮説としては、フォームオブジェクトを使用していることが関係していると考えている

メンターさんに質問したがフォームオブジェクトを使っているからという結論だったので、今後また勉強したい。

 

 

 

 

 

感想

 年内完成を目標にしていたが、あと少し終わらせることができなかった、商品購入機能で多くつまづいてしまったことに原因がある。

来年が勝負になるので

勉強の質と量を上げていく

 

2020/12/21~2020/12/27

 

 今回の内容

 

 

・商品購入機能の実装

・クレジットカード決済機能の実装練習

オープンAPIを用いてクレジット決済機能を導入する

PayJpサービスを利用

javascriptでフォームを送信する

 

・1つのフォームから複数のテーブルに保存する機能練習

1つのフォームから複数のテーブルに保存するためにはフォームオブジェクトを使用する

 

・実際のアプリへの実装

購入機能に必要なモデルやコントローラーを作成する

 

 

 

感想

 購入機能を進める際によくわからないまま、必要そうな機能を実装していった為、どこが間違っているかわからず、時間がかかってしまっている。

フォームオブジェクト、クレジット決済についてはまだ理解が浅い為あとで復習したい

 

一つ一つ問題を解決していき年内に完成させたい

 

2020/12/20

 

 今回の内容

 

 

・商品削除機能の実装

 ・destoroyアクションの導入

MVCの流れ通り実装していく

ビューでこのように

<%= link_to '削除', "/item/@item", method: :delete, class:'item-destroy' %>

コントローラーで

before_action :item_find, only: [:show, :edit, :update, :destroy]
def destroy
@item.destroy
end
private
def item_find
@item = Item.find(params[:id])
end
end

書いたところエラーが発生

ActiveRecord::RecordNotFound in ItemsController#destroy

Couldn't find Item with 'id'=@item

Extracted source (around line #47):
45
46
47
48
49
              
 
def item_find
@item = Item.find(params[:id])
end
end
 

destroyアクションでidが見つからないエラーが出ている
他のアクションではこのコードで上手くいっていることからビューの記述が間違っているのではないかと考えた

ビューの記述を

<%= link_to '削除', item_path(@item.id), method: :delete, class:'item-destroy' %>

と変更したところ解決した

 

メンターさんに質問したところ

railsではlink_toを使用する時はurlを記述するより、rails routesのPrefixを記述する方が一般的で使いやすいらしい

 

細かい部分を修正してLGTM

 

 

 

感想

 

コードが長くなってきたのでメンターさんに指摘される前に自分でも同じコードが合ったらまとめられるようにしたい

 

 

チーム開発に誘っていただいき、チームでアプリ開発をすることができる

その第1回のミーティングが実施された

人数が多いため2グループに分けることになったがその1グループのリーダーをすることになった

意見を出すことの方が多く、まとめる役はあまりやってこなかったがいい経験になると思うので頑張りたい

 

2020/12/18~2020/12/19

 

 今回の内容

 

 

・商品詳細表示機能の実装

 

・詳細ページの編集

前回の疑問点

 

トップページでは画像のリンクを

<%= image_tag item.image, class: "item-img" %>

 と書いていたが

詳細ページでは

<%= image_tag @item.image, class:"item-box-img" if @item.image.attached? %>

と@を付けないとエラーになった理由

 

メンターさんに質問する前に自分でもう一度コードをみていたら

トップページは

<% @items.each do |item| %>
<li class='list'>
<%= link_to item_path(item.id), method: :get do %>
<div class='item-img-content'>
<%= image_tag item.image, class: "item-img" %>

1行目でitemを定義していたため使えているということがわかった

念のためメンターさんにも確認したところ

その解釈で合っていて、コントローラーに定義しないとビューに反映させることはできないと教えていただきました。

 

商品詳細ページは細かいところを直しLGTM をもらった

 

 

・商品詳細表示機能の実装

・editとupdateのMVCを追加

newとcreateアクションとほぼ同じ実装

updateのエラーメッセージを表示させる際に

エラーが発生

内容はupdateメソッドでmodelがないというエラーだった

ビューのコード

<%= form_with model: @item, local: true do |f| %>
 
<%= render 'shared/error_messages', model: f.object %>

コントローラのコード

def edit
@item = Item.find(params[:id])
end

def update
item = Item.find(params[:id])
item.update(item_params)
if item.save
redirect_to item_path
else
render :edit
end
end

ビューのrenderエラーメッセージのコードの引数が@itemに対して、コントローラーでのupdeteの記述がitemで書いていたことが原因だった

def update
@item = Item.find(params[:id])
@item.update(item_params)
if @item.save
redirect_to item_path
else
render :edit
end
end

 このように直して解決した。

 

コントローラーのコードが

class ItemsController < ApplicationController
before_action :authenticate_user!, only: [:new]

def index
@items = Item.includes(:user).order('created_at DESC')
end

def new
@item = Item.new
end

def create
@item = Item.new(item_params)
if @item.save
redirect_to root_path
else
render :new
end
end

def show
@item = Item.find(params[:id])
end

def edit
@item = Item.find(params[:id])
end

def update
@item = Item.find(params[:id])
if @item.update(item_params)
redirect_to item_path
else
render :edit
end
end

private

def item_params
params.require(:item).permit(:image, :name, :explanation, :price, :category_id, :status_id, :deliver_fee_id, :shipping_area_id, :shipping_day_id).merge(user_id: current_user.id)
end
 
end

このように

@item = Item.find(params[:id])

 を3回記述している

railsでは同じ記述は繰り返し書かないようにしたい

before_actionにまとめたいがメソッド化しないと記述できない

よって

class ItemsController < ApplicationController
before_action :authenticate_user!, only: [:new]
before_action :item_find, only: [:show, :edit, :update]

def index
@items = Item.includes(:user).order('created_at DESC')
end

def new
@item = Item.new
end

def create
@item = Item.new(item_params)
if @item.save
redirect_to root_path
else
render :new
end
end

def show
end

def edit
end

def update
if @item.update(item_params)
redirect_to item_path
else
render :edit
end
end

private

def item_params
params.require(:item).permit(:image, :name, :explanation, :price, :category_id, :status_id, :deliver_fee_id, :shipping_area_id, :shipping_day_id).merge(user_id: current_user.id)
end

def item_find
@item = Item.find(params[:id])
end
end

privateにメソッドとして記述することでまとめることができる

 

補足: before_actionで特定のアクションのみ使いたい場合はonlyだが

   特定のアクションのみ使いたくない場合はexceptと記述する

 

 

感想

 

メンターさんに質問してみると、自分の見落としですぐに解決することが多い

もう少し自分で考えてから質問していきたい

今回のbefore_actionのように調べて補足内容がわかったらっ忘れないようにここでアウトプットしていく