ネストしているモデルに対するform_withの書き方

ユーザーが投稿した記事(post)に対してコメント(comment)する想定

 

 comments_controller.rbの記述 
def new
@post = Post.find(params[:post_id]) ←現在の投稿のデータをインスタンスに入れておく
@comment = Comment.new         ←新規commentのインスタンス生成
end
 
def create
current_user.comments.create!(comment_params)
end

postモデルとcommentモデルの両方にデータを登録するためnewメソッドで両方の情報を呼び出しておく

※postモデルには「誰が」「どんなコメントを」

※commentモデルには「誰が」「どの投稿に」

 

ストロングパラメータの定義
private
def comment_params
params.require(:comment).permit(:title, :content , :image )
 
           .merge(user_id: current_user.id, post_id: params[:post_id])
end
 
.merge 

ユーザーが記入した情報の他に、記入していない裏の情報も一緒に保存したい時

今回の例では「現在ログイン中のユーザーID(current_user.id)」と「コメント先の投稿ID(params[:post_id])

 

 comments/new.html.erbの記述
<%= form_with model: [@post, @comment] do |f| %>
<p>タイトル<%= f.text_field :title %></p>
<p>本文<%= f.text_field :content %></p>
<p>イメージ画像<%= f.file_field :image %></p>
<%= f.submit "投稿" %>
<% end %>

※ネストしているモデルのDBへの書き込みの場合、form_with内で対象のモデルを複数記述しなければいけない

※今回は「@post」と「@comment」

 

参考

ネストしているモデルに対するform_withの書き方 - Qiita

mergeメソッドについて改めて理解を深めた - Qiita

 

Carrierwave

rails new carrierwave sample -d postgresql -T

rails db:create

 

gemを追加

gem "carrierwave"

bundle install

 

アップローダークラスの作成

rails g uploader video

rails g uploader アップローダー名

 

app/uploader/video_uploader.rb

以下をコメントインして、MOV wmv mp4を追加

def extension_allowlist
%w(jpg jpeg gif png MOV wmv mp4)
end

 

scaffoldを使用してPostモデルとtitle、videoカラムを作成

rails g scaffold Post title:string video:string

rails db:migrate

 

Postモデルにアップローダークラスとカラムの紐付け

app/models/post.rb

class Post < ApplicationRecord
 mount_uploader :video, VideoUploader
end

※mount_uploader :カラム名, アップローダークラス

 

バリデーションの設定(app/models/post.rbに追記)

class Post < ApplicationRecord
 mount_uploader :video, VideoTopUploader

 validates :title, :video, :presence => true
end

 :presence => true 空白を許可しない

 

viewの編集

今回はscaffoldを使用しているのでレンダリングを編集していますが、自作の場合などはapp/views/posts/new.html.erbを編集

_form.html.erb

<div class="field">
 <%= form.label :video %>
 <%= form.text_field :video %> #これを↓に書き換え
 <%= form.file_field :video, :accept => "video/*" %>
</div>

 ※file_fieldに書き換えることで、ファイル選択ができるようになる

 ※"video/*"で動画ファイルを選択できる

   画像ファイルを指定したい時は"image/*"

 

動画をGit管理下から除外(commitやpushの際のデータ量が多すぎてしまうため)

.gitignore

#略

/public/packs
/public/packs-test
/node_modules
/yarn-error.log
yarn-debug.log*
.yarn-integrity

/public/uploads ←これを追記

 

ここまでで動画のアップロードができるようになっている

 

動画の再生

詳細ページ(show)にて再生の方法

app/views/posts/show.html.erb

<p>
<strong>Video:</strong>
#以下を書き換え
<%= video_tag@post.video.url, :controls => true %>
</p>

video_tag:動画ファイルの呼び出し

post.video.url:動画の保管場所にアクセス

controls => true:手動再生オプションを追加(YouTubeのような感覚)

 

再生画面のサイズ設定

カメラで撮影したものなどはブラウザ上でものすごく大きく表示されてしまったりするので、任意のサイズに縮小

app/views/posts/show.html.erb

<p>
<strong>Video:</strong>
<%= video_tag@article.video.url, height: 400, width: 600, :controls => true %>
</p>
↑   ここを追記   ↑

 ※数値は自由に設定可

resourcesとresourceの違いと活用方法

resources

複数のリソースに対するCRUD処理を行うためのルーティングを作成する

 →railsにおける7大基本ルーティング

 

ヘルパーメソッド HTTPメソッド パス アクション名
users GET /users(.:format) users#index
  POST /users(.:format) users#create
new_user GET /users/new(.:format) users#new
edit_user GET /users/:id/edit(.:format) users#edit
user GET /users/:id(.:format) users#show
  PATCH /users/:id(.:format) users#update
  DELETE /users/:id(.:format) users#destroy

 

resources :コントローラ名(複数形)

 

resource

ただ1つのリソースに対するCRUD処理を行うためのルーティング

リソースは1つだけなので、urlに:idを含む必要がなく、当然一覧画面(index)も必要ない

 →一覧表示(index) = 詳細表示(show)

 

ヘルパーメソッド HTTPメソッド パス アクション名
new_user GET /user/new(.:format) users#new
edit_user GET /user/edit(.:format) users#edit
user GET /user(.:format) users#show
  PATCH /user(.:format) users#update
  DELETE /user(.:format) users#destroy
  POST /user(.:format) users#dcreate

 

resource :コントローラ名(単数形)

 

使い方

基本的にはresourcesとresourceを組み合わせて使う

例として、会員サイトの様なものを挙げてみる

全会員一覧や各会員詳細は誰でも閲覧できて問題ないが、会員情報の編集などは自分のものだけしかできないと困ったことになってしまう

.createと.create!の違いとは

バリデーションの理解

オブジェクトがデータベースに保存される前に、そのデータが正しいかどうか(こちらが設定したフィルタを通過するかどうか)を検証する仕組みをバリデーションという

 

!の有無による違い

createメソッドを実行する時に、バリデーションを通らなかった場合に挙動が異なる

 !有:ActiveRecordエラーが表示され、次のアクションに進めない

 !無:次のアクションに進みはするが、データベースにデータが登録されない

  →saveとupdateは「false」を返し、createはオブジェクトをそのまま返す

 

バリデーションの設定

app > models > application_record.rb

 validates :カラム名, 条件

 

バリデーションの種類(一例)

空でないこと:presence: true

空であること:absence:true

長さ:length: { minimum: 1 } 1文字以上

   length: { maximum: 10 } 10文字以下

   length: { in: 1..10 } 1文字以上10文字以下

   length: { is: 7 } 7文字のみ 

 

form_withって何?

form_withとは

railsで情報を送信するためのヘルパーメソッド

 

form_withの使い方

①情報をデータベースに保存しない時(同期通信とする)

<%= form_with url: "パス", local: true do |form| %>

 ******

<% end %>

 

②情報をデータベースに保存する時(同期通信とする)

<%= form_with model: モデルクラスのインスタンス, local: true do |form| %>

 ******

<% end %>

 

def new

 @user = User.new

end

 

<%= form_with model: @user, url: "/users", method: :post, local: true do |form| %>

※赤字は省略可(↓で説明する自動振り分けの部分を省略せずに記述するとこのようになる)

この時、コントローラで作成したインスタンス変数が何も情報を持っていない時は自動的にcreateアクションへ、.findなどで既に情報を持っている時は自動的にupdateアクションへ振り分けられる

RailsのCRUD処理について

CRUD処理とは

Ruby on Railsでの

 新規登録(Create)

 一覧表示(Read)

 更新(Update)

 削除(Delete)

の一連の流れの事を指す

 

RESTを意識したアプリケーションの作成

REST(Representational State Transfer)「ネットワーク上にあるデータに対して(表示、作成、更新、削除)などの操作を行う」という、アプリケーション作成における大切な考え方

この考えに則って作成されたアプリケーションを「RESTフル」と呼ぶ

 

RESTフルなルーティング

HTTPメソッド パス コントローラのアクション アクションの役割
情報をやり取りする通信手段︎ 場所・住所(URL) アプリ上で設定した動作  
GET(リソースの取得) /users index リソースの一覧表示
GET(リソースの取得) /users/new new 新規作成画面を表示
POST(リソースの作成や追加) /users create リソースを追加
GET(リソースの取得) /users/:id show リソースの詳細を表示
GET(リソースの取得) /users/:id/edit edit リソースの更新画面を表示
PATCH(リソースの置き換え) /users/:id update リソースを更新
DELETE(リソースの削除) /users/:id destroy リソースを削除