ihatov08 blog

プログラミング初心者だけどRailsとSwiftマスターします

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