初めて自分でアプリ制作を行った際に自分がめちゃくちゃ苦労した事を挙げていく
haml記法での変数の記入方法
haml記法でDBから画像を取得して表示する時は主にimage_tagを使用しました。
link_toと併用して、画像をリンクにする方法
- @menus.each do |menu|
= link_to image_tag( menu.image, class: 'thumnail-menu'), menu_path(menu.id), method: :get
ここでのもう一つのポイントは、パスに変数を入れなければならなかった時、どう記入するかである。
menu_path単独では、そのimageに結びつく詳細表示画面にアクセスができないので、(menu.id)でmenuのidを取得する必要があった。
しかしshowアクションで定義したviewでは
= link_to image_tag( @menu.image, class: 'thumnail-food'), '#'
%ul.detail-info
%li.detail-info__title
= @menu.title
%li.detail-info__price
価格: ¥#{ @menu.price }
%li.detail-info__calorie
カロリー: #{ @menu,calorie }kcal
def show
@menu = menu.find(params[:id])
@reviews = @menu.reviews.includes(:user).order('created_at DESC')
@review = Review.new
end
このようにコントローラーで定義されたインスタンス変数@menuによってカラムのデータを取得している。
indexではすでに@menus.each doで@menuからのデータを毎回取得している。
しかしshowでは一つづつインスタンス変数を記入する必要がある。
form_forの使用方法
初めのうちはform_tagばかり使っていましたが、何かと融通がきくform_forを使ってレビュー投稿画面の作成をしました。
reviewsはmenusに対して1対多のの関係であるため、ルーティングはネストされている。
そのため、form_forに指定する引数として、@menus, @reviewの二つを指定する。
.forms
- if current_user
.form
= form_for [@menu, @review] do |f|
= f.text_area :text, placeholder: "レビューを書く"
%br/
= f.submit 'post'
= link_to 'X close', '#', class: 'post-close'
コントローラー側ではcreateアクションにて@reviewインスタンスを生成する。
def show
@menu = Menu.find(params[:id])
@reviews = @menu.reviews.includes(:user).order('created_at DESC')
@review = Review.new
end
色々参考にしたものの中ではこのブログが一番わかりやすいかも
https://cre8cre8.com/rails/how-to-use-form_for.htm
リンクの飛ばし方は他にも色々あるみたいです。