railsで独自のバリデーションメソッドを実装する
画像ファイルのアップロードのバリデーションを独自で定義してみた。
定義したのはcheck_image
メソッド。名前は任意で構わない。
if !['.jpg', '.png', '.gif'].include?
ではjpg,png,gifファイルだったら、エラーにする。
errors.add
でerrors連想配列にimage
をキーとして"JPG, PNG, GIFのみアップロードできます。"
を値として入れることができる。
elsif file.size > 1.megabyte
はファイルサイズが1MB以上のときにエラーを発生させる。
models/user.rb
def check_image if !['.jpg', '.png', '.gif'].include?(File.extname(name).downcase) errors.add(:image, "JPG, PNG, GIFのみアップロードできます。") elsif file.size > 1.megabyte errors.add(:image, "1MBまでアップロードできます") end end
しかし、このままではメソッドを呼ぶことができない。下記のコードをmodels/user.rb
に記述することでメソッドを呼ぶ。
models/user.rb
validate :check_image
railsは裏で色々やってくれているので、初心者は何が起こっているのか理解できない。もっと仕組みを理解しないと。 Rubyの言語自体の理解をしないといけないんだろうな。 大変だけど、1つ1つできることが増えていくことはすごく楽しい!
前提として。。。 ①public配下にuser_imagesフォルダを作成しておくこと。 ②画像ファイルをstringで保存するメソッドを定義する。 models/user.rb
def set_image(file) if !file.nil? file_name = file.original_filename File.open("public/user_images/#{file_name}", 'wb'){|f| f.write(file.read)} end
viewはfile_field
でformを作成すること。
controllerのcreateアクションでmodelで定義した独自メソッドを呼ぶ
肝は@user.set_image(file)
で呼ぶこと。引数は(file)にすること。
usercontroller
def update file = params[:user][:image] @user.set_image(file) respond_to do |format| if @user.update(user_params) format.html { redirect_to @user, notice: 'User was successfully updated.' } format.json { render :show, status: :ok, location: @user } else format.html { render :edit } format.json { render json: @user.errors, status: :unprocessable_entity } end end end