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 %>
以上になります。
回答1件
あなたの回答
tips
プレビュー