Railsアプリの本番環境における画像データの置き場所

こんにちは!kossyです!




さて、今回は、Railsでアプリケーションを開発する際の、
本番環境における画像データの置き場所はどこがいいのか、について、
ブログに残してみたいと思います。




ロゴや固定のアイコンはassetへ、ユーザーがアップロードする画像はpublicへ

結論は上記になります。

なぜ、配置する場所を変えるのかと言うと、asset_precompileの対象の範囲にpublicが含まれないからです。

ログや固定のアイコンと言うのは、システム側に依存するものなので、precompileの対象にさせるために、
assets配下に置きます。

対して、ユーザーがアップロードするような画像は、precompileの対象に含む必要はないので、
public配下に置かれるようにします。



asset precompileの説明はこちらのブログが詳しかったです。
Rails初学者がつまずきやすい「アセットパイプライン」



参考にさせていただいたサイト

Ruby on Rails - Railsで扱う画像はassetsとpublic、どちらに置くといいのでしょうか?|teratail

ActiveRecordのメソッドに「!」がついた時とそうでない時の挙動の違い

こんにちは!kossyです!




さて、今回は、ActiveRecordのメソッド(create, update, destroy, save)に!が付いている時と
そうでない時の挙動の違いについて、ブログに残してみたいと思います。




例外を起こすか否か

端的にまとめると、上記になります。

「!」を伴うメソッドは、バリデーションの失敗時に例外を起こし、動作を終了します。
対して、「!」を伴わないメソッドは、バリデーションに失敗しても、例外を起こさずに動作を継続させます。



トランザクション処理を行いたいとき


例えば、ActiveRecord.transaction メソッドを使うときは、ブロック内でcreateやsaveをする場合、

ActiveRecord::Base.transaction do
  @hoge.save!
end

というように、!をつけて例外を起こすようにします。
transactionは例外処理に反応してロールバックするので、!をつけて例外を起こさせるようにするわけです。



まとめ

・!の有無は、バリデーションの失敗時に例外を起こすか否か
・!が付いていれば例外を起こす
・なければ起こさない
トランザクション処理のブロック内では!を付ける




参考にさせていただいた記事

rails のtransaction処理 - Qiita
rails save! create! update!のバリデーション例外を捕捉する - Qiita

「overloaded POST」 ってなんぞや?

こんにちは!kossyです!





めっきりアウトプットが減ってしまいました、、、
Ruby sliverの取得・基本情報技術者の取得・オリアプの開発など、
やりたいこと、やるべきことが湯水の如く湧いて出てくるので、
やらないことを決めることが困難な状況であります。



今日は久しぶりにブログを描きたくなったので、
「overloaded POST」について、ブログに残してみたいと思います。




HTML5ではPUT/DELETEメソッドが採用されてない

HTML5(正確には旧バージョンでも採用されていないが)ではformでHTTPメソッドである
PUTとDELETEメソッドを採用していません。

HTTPメソッドってなんぞや?という人は、
こちらを参考にしてみてください。
https://wa3.i-3-i.info/word11405.html

平たく言うと、インターネットでWebページを見るときのお願いの仕方のことですね。
そのお願いの仕方の中に、値を更新するような処理をするPUTメソッドと、
値を削除する処理をするDELETEメソッドが採用されていないと言う訳です。

「え、削除も更新もできないってやばくね?」
って思われる方がいらっしゃるかもしれませんが、
先人達の知恵は素晴らしく、PUTやDELETEが無くとも更新や削除の挙動を実現しているのです。

その一つが、「overloaded POST」と言う手法です。




「overloaded POST」って?


webアプリケーションフレームワークの一つであるRuby On Railsでは、PUTやDELETEの挙動を、
_methodというパラメータにHTTPメソッド名(PUTとかDELETEとか)を埋め込んでPOSTリクエストをすることで、
実現しています。この手法を「overloaded POST」と呼ぶそうです。

なので、RailsでDELETEの挙動を実現させるためには、

    = link_to "削除", "/reviews/#{@review.id}", method: :delete

という風に、method: :deleteと明示的に記述する必要があります。



なんでHTML5にPUTとDELETEが採用されてないの?



jxck.hatenablog.com


こちらの記事によると、


まとめると、以下のような感じかと思います。

HTML4.x 以前: 需要があまりなく、積極的に仕様に追加する人もおらず、 HTTP3.2 からの仕様を引き継いでいた。
XForms: 仕様には取り込んだが、それを含む予定だった XHTML2.0 の策定が終了し、普及しなかった。
HTML5: 議論は何度かあり、現在 Cameron 氏のドラフトあたりが有力で、これはそのうち ML に投げられる模様。
HTML5.1?: Cameron 氏のドラフトが議論され、承認されればこの辺で入るかもしれない。入らない可能性は大いにあると思われる。

とのことで、需要がないから採用されていない、という要因が大きそうです。




参考にさせていただいた記事

なぜ html の form は PUT / DELETE をサポートしないのか? - Block Rockin’ Codes
https://wa3.i-3-i.info/word11405.html
https://www.amazon.co.jp/%E3%83%91%E3%83%BC%E3%83%95%E3%82%A7%E3%82%AF%E3%83%88-Ruby-Rails-%E3%81%99%E3%81%8C%E3%82%8F%E3%82%89-%E3%81%BE%E3%81%95%E3%81%AE%E3%82%8A/dp/4774165166