ネストしているモデルに対するform_withの書き方
ユーザーが投稿した記事(post)に対してコメント(comment)する想定
comments_controller.rbの記述
postモデルとcommentモデルの両方にデータを登録するためnewメソッドで両方の情報を呼び出しておく
※postモデルには「誰が」「どんなコメントを」
※commentモデルには「誰が」「どの投稿に」
ストロングパラメータの定義
.merge
ユーザーが記入した情報の他に、記入していない裏の情報も一緒に保存したい時
今回の例では「現在ログイン中のユーザーID(current_user.id)」と「コメント先の投稿ID(params[:post_id])
comments/new.html.erbの記述
※ネストしているモデルのDBへの書き込みの場合、form_with内で対象のモデルを複数記述しなければいけない
※今回は「@post」と「@comment」
参考
ネストしているモデルに対するform_withの書き方 - Qiita
mergeメソッドについて改めて理解を深めた - Qiita
Carrierwave
rails new carrierwave sample -d postgresql -T
rails db:create
gemを追加
bundle install
アップローダークラスの作成
rails g uploader video
app/uploader/video_uploader.rb
以下をコメントインして、MOV wmv mp4を追加
scaffoldを使用してPostモデルとtitle、videoカラムを作成
rails g scaffold Post title:string video:string
rails db:migrate
Postモデルにアップローダークラスとカラムの紐付け
app/models/post.rb
※mount_uploader :カラム名, アップローダークラス
バリデーションの設定(app/models/post.rbに追記)
:presence => true 空白を許可しない
viewの編集
今回はscaffoldを使用しているのでレンダリングを編集していますが、自作の場合などはapp/views/posts/new.html.erbを編集
_form.html.erb
※file_fieldに書き換えることで、ファイル選択ができるようになる
※"video/*"で動画ファイルを選択できる
画像ファイルを指定したい時は"image/*"
動画をGit管理下から除外(commitやpushの際のデータ量が多すぎてしまうため)
.gitignore
ここまでで動画のアップロードができるようになっている
動画の再生
詳細ページ(show)にて再生の方法
app/views/posts/show.html.erb
video_tag:動画ファイルの呼び出し
post.video.url:動画の保管場所にアクセス
controls => true:手動再生オプションを追加(YouTubeのような感覚)
再生画面のサイズ設定
カメラで撮影したものなどはブラウザ上でものすごく大きく表示されてしまったりするので、任意のサイズに縮小
app/views/posts/show.html.erb
※数値は自由に設定可
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処理とは
新規登録(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 | リソースを削除 |