前提・実現したいこと
Ruby on Railsで投稿に画像を貼り付けようとしています。
投稿に貼り付けられた画像の表示位置を入れ替える機能を実装するために「acts_as_list」を導入したところ、Railsサーバーの起動やマイグレーションが実行できなくなりました。
ルーティングなどの設定を見直したのですが、おかしな点がわかりませんでした。
どうすればこのエラーが解決するのでしょうか?
発生している問題・エラーメッセージ
undefined local variable or method `on' for #<ActionDispatch::Routing::Mapper:0x00007fc236c67320> (NameError)
該当のソースコード
routes.rb
Ruby
1Rails.application.routes.draw do 2 root "top#index" 3 get "about" => "top#about", as: "about" 4 get "bad_request" => "top#bad_request" 5 get "forbidden" => "top#forbidden" 6 get "internal_server_error" => "top#internal_server_error" 7 8 resources :user do 9 get "search", on: :collection 10 resources :posts, only: [:index] 11 end 12 13 resource :session, only: [:new, :create, :destroy] 14 resource :account, only: [:show, :edit, :update] 15 resource :password, only: [:show, :edit, :update] 16 17 resources :articles 18 resources :posts do 19 resources :images, controller: "post_images" do 20 patch :move_higher, :move_lower, on: :user 21 end 22 end 23end 24
post_image.rb
Ruby
1 2class PostImage < ApplicationRecord 3 belongs_to :post 4 has_one_attached :data 5 acts_as_list scope: :post 6 7 attribute :new_data 8 9 validates :new_data, presence: { on: :create } 10 11 validate if: :new_data do 12 if new_data.respond_to?(:content_type) 13 unless new_data.content_type.in?(ALLOWED_CONTENT_TYPES) 14 errors.add(:new_data, :invalid_image_type) 15 end 16 else 17 errors.add(:new_data, :invalid) 18 end 19 end 20 21 before_save do 22 self.data = new_data if new_data 23 end 24end 25
20200518065812_create_post_images.rb
Ruby
1class CreatePostImages < ActiveRecord::Migration[5.2] 2 def change 3 create_table :post_images do |t| 4 t.references :post # 外部キー 5 t.string :alt_text, null: false, default: "" # 代替テキスト 6 t.integer :position # 表示位置 7 8 t.timestamps 9 end 10 end 11end 12
post_image_controller.rb
Ruby
1class PostImagesController < ApplicationController 2 before_action :login_required 3 4 before_action do 5 @post = current_user.posts.find(params[:post_id]) 6 end 7 8 # 画像一覧 9 def index 10 @images = @post.images.order(:position) 11 end 12 13 # 編集フォームにリダイレクト 14 def show 15 redirect_to action: "edit" 16 end 17 18 # 新規登録フォーム 19 def new 20 @image = @post.images.build 21 end 22 23 # 編集フォーム 24 def edit 25 @image = @post.images.find(params[:id]) 26 end 27 28 # 新規作成 29 def create 30 @image = @post.images.build(image_params) 31 if @image.save 32 redirect_to [@post, :images], notice: "画像を作成しました!" 33 else 34 render "new" 35 end 36 end 37 38 # 更新 39 def update 40 @image = @post.images.find(params[:id]) 41 @image.assign_attributes(image_params) 42 if @image.save 43 redirect_to [@post, :images], notice: "画像を更新しました!" 44 else 45 render "edit" 46 end 47 end 48 49 # 削除 50 def destroy 51 @image = @post.images.find(params[:id]) 52 @image.destroy 53 redirect_to [@post, :images], notice: "画像を削除しました!" 54 end 55 56 # 表示位置を上げる 57 def move_higher 58 @image = @post.images.find(params[:id]) 59 @image.move_higher 60 redirect_back fallback_location: [@post, :images] 61 end 62 63 # 表示位置を下げる 64 def move_lower 65 @image = @post.images.find(params[:id]) 66 @image.move_lower 67 redirect_back fallback_location: [@post, :images] 68 end 69 70 # ストロング・パラメータ 71 private def image_params 72 params.require(:image).permit( 73 :new_data, 74 :alt_text 75 ) 76 end 77end 78
posts_helper.rb
Ruby
1module PostsHelper 2 def the_first_image(post) 3 image = post.images.order(:position)[0] 4 5 render_post_image(image) if image 6 end 7 8 def other_images(post) 9 buffer = "".html_safe 10 11 post.images.order(:position)[1..-1]&.each do |image| 12 buffer << render_post_image(image) 13 end 14 15 buffer 16 end 17 18 private def render_post_image(image) 19 content_tag(:div) do 20 image_tag image.data.variant(resize: "530x>"), 21 alt: image.alt_text, 22 style: "display: block; margin: 0 auto 15px" 23 end 24 end 25end 26
補足情報(FW/ツールのバージョンなど)
ruby 2.5.1
Rails 5.2.4.2
acts_as_list 1.0.1
あなたの回答
tips
プレビュー