質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

860閲覧

Active storageにバリデーションをかけたいのにかけられない

kawasaki4563

総合スコア32

Ruby on Rails 6

Ruby on Rails 6は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/04/05 07:34

編集2021/04/05 09:20

Active storageにバリデーションをかけて動画しか投稿できないようにしたいのですが、動画以外も投稿できてしまいます。

やってみたこととしては、movie.rb

class Movie < ApplicationRecord has_one_attached :movie has_many :movie_liked_users, through: :movie_likes, source: :user has_many :movie_likes has_many :movie_comments, dependent: :destroy belongs_to :user has_many :movie_likes with_options presence: true do validates :title validates :introduction validates :movie end validate :movie_type def movie_type if movie.attached? if !movie.content_type.in?(%('movie/mp4 movie/mov')) errors.add(:movie, 'にはmp4またはmovファイルを添付してください') end end end end

といったふうに、movie_typeメソッドの2つ目のif文の内容を
if !movie.content_type.in?(%('movie/mp4 movie/mov'))
に変えてみたのですが、これをした結果、MP4の動画を投稿しようとしても投稿にそもそも失敗してしまう様になりました。
投稿が保存されません。
試しにmovie.rbの

validate :movie_presence def movie_type if movie.attached? if !movie.content_type.in?(%('movie/mp4 movie/mov')) errors.add(:movie, 'にはmp4またはmovファイルを添付してください') end end end

の記述を消してみたところ、投稿はできました。なので、パラメーターには情報が来ているようでした。

動画投稿に関するmodel

movie.rb

class Movie < ApplicationRecord has_one_attached :movie has_many :movie_liked_users, through: :movie_likes, source: :user has_many :movie_likes has_many :movie_comments, dependent: :destroy belongs_to :user has_many :movie_likes with_options presence: true do validates :title validates :introduction validates :movie end validate :movie_presence def movie_presence if movie.attached? if movie.content_type.in?(%('movie/mp4 movie/mov')) errors.add(:movie, 'にはmp4またはmovファイルを添付してください') end end end end

動画投稿に関するコントローラー

class MoviesController < ApplicationController before_action :authenticate_user!, only: %i[new update create edit update destroy] before_action :find_movie, only: %i[edit update show destroy] def index @movies = Movie.all.order(id: 'DESC') @movie_like = MovieLike.new end def new @movie = Movie.new end def show @movie_comment = MovieComment.new @movie_comments = @movie.movie_comments.order(id: 'DESC') end def create @movie = current_user @movie = Movie.create(movie_params) if @movie.save redirect_to movies_path, notice: '投稿に成功しました' else redirect_to new_movie_path, notice: '投稿に失敗しました' end end def edit; end def update @movie.update(movie_params) redirect_to movies_path end def destroy if @movie.destroy redirect_to movies_path, alert: '投稿を削除しました' else redirect_to movies_path end end private def movie_params params.require(:movie).permit(:title, :introduction, :movie).merge(user_id: current_user.id) end def find_movie @movie = Movie.find(params[:id]) end def force_redirect_unless_my_movie return redirect_to movies_path, alert: '権限がありません' if @movie.user != current_user end end

動画投稿画面

<%= form_with model: @movie, local: true do |f| %> <p>title</p><%= f.text_field :title %> <br> <p>introduction</p><%= f.text_area :introduction %> <br> <p>movie</p><%= f.file_field :movie %> <br> <%= f.submit '投稿する', class:"button"%> <% end %>

以上になります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/04/05 07:47

> 動画以外も投稿できてしまいます。 選択できて正しく保存もされてしまう、ということでしょうか?
kawasaki4563

2021/04/05 08:40

はい、そうです。動画、(.mov,mp4)以外を投稿できないようにしたいのですが、@maisumakunさんの言う通り選択できて正しく保存もされてしまいます
guest

回答1

0

自己解決

自己解決しました
gem 'activestorage-validator'というgemを入れることで解決しました。
リンクはこちらに乗せておきます。
aki77
/
activestorage-validator

投稿2021/04/06 23:31

kawasaki4563

総合スコア32

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問