現在Ruby on Railsで猫の画像を投稿するウェブアプリケーションを作成しています。ユーザー登録機能をgem 'devise'で、プロフィール画像をgem 'carrierwave'で作成しました。ユーザー詳細ページ(users/show)でプロフィール画像を表示することはできたのですが、猫の画像の詳細ページ(photos/show)で表示できずに困っています。
エラー詳細
NoMethodError in Posts#show undefined method `image?' for nil:NilClass <div class="text-center post-user"> <%= link_to user_path(@post.user) do %> <% if @user.image? %> <%= image_tag @user.image.thumb.url, class: "round-img" %> <% else %> <%= image_tag "/assets/default.jpg", class: "round-img" %>
ルーティング
Rails.application.routes.draw do #get 'twitters/index' devise_for :users, controllers: { registrations: 'registrations' } #controllers: { omniauth_callbacks: 'users/omniauth_callbacks' }, get 'tops/index' root to: 'tops#index' get '/users/:id', to: 'users#show', as: 'user' patch 'users/:id', to: 'users#update' #get '/users/edit/:id', to: 'users#edit', as: 'edit_user' resources :posts, only: %i(new create show destroy) do resources :photos, only: %i(create) resources :likes, only: %i(create destroy) end # For details on the DSL available within this file, see https://guides.rubyonrails.org/routing.html end
ユーザー詳細ページのコントローラー(users_controller.rb)
class UsersController < ApplicationController def show @user = User.find_by(id: params[:id]) end def edit @user = User.find(params[:id]) end def update @user = User.find(params[:id]) if current_user == @user if @user.update(user_params) flash[:success] = 'プロフィール画像を変更しました' render :show else flash.now[:danger] = 'プロフィール画像の変更に失敗しました' render :show end else redirect_to user_path end end private def user_params params.require(:user).permit(:image) end end
ユーザー詳細ページのビュー(users/show.html.erb)
<div class="container"> <h3 class="text-center text-secondary mb-4">ユーザー情報</h3> <div class="row col-lg-6 offset-lg-3"> <div class="offset-lg-2 col-lg-4 text-center profile-image mb-3"> <%= form_for(@user) do |f| %> <% if @user.image? %> <%= image_tag @user.image.thumb.url, class: "round-img" %> <% else %> <%= image_tag "/assets/default.jpg", class: "round-img" %> <% end %> <button type="button" class="btn btn-outline-secondary rounded-pill mt-3"> <%= f.file_field :image, accept: 'image/jpg,image/gif,image/png' %> </button> <%= f.submit 'プロフィール画像変更', class: 'btn btn-secondary mt-3' %> <% end %> </div> <div class="col-lg-6 text-center profile-text mb-3"> <h3><%= @user.name %></h3> <% if @user == current_user %> <p><%= @user.email %></p> <%= link_to "プロフィール編集", edit_user_registration_path, class: "btn btn-outline-dark common-btn edit-profile-btn" %> <% end %> </div> </div> </div>
猫の画像詳細ページのコントローラー(photos_controller.rb)
class PostsController < ApplicationController before_action :authenticate_user!, only: [:new] def new @post = Post.new @post.photos.build end def create @post = Post.new(post_params) if @post.photos.present? @post.save redirect_to root_path flash[:notice] = "投稿が保存されました" else redirect_to root_path flash[:alert] = "投稿に失敗しました" end end def show @post = Post.find_by(id: params[:id]) @user = User.find_by(id: params[:id]) end def destroy @post = Post.find_by(id: params[:id]) if @post.user == current_user flash[:notice] = "投稿が削除されました" if @post.destroy else flash[:alert] = "投稿の削除に失敗しました" end redirect_to tops_index_path end private def post_params params.require(:post).permit(:caption, photos_attributes: [:image]).merge(user_id: current_user.id) end def user_params params.require(:user).permit(:image) end end
猫の画像の詳細ページ(photos/show.html.erb)
<div class="container"> <div class="col-md-10 col-md-offset-1 mx-auto"> <div class="row"> <div class="col-md-8"> <div class="card-left mt-3"> <%= image_tag @post.photos.first.image.url(:medium), class: "card-img-top" %> </div> </div> <div class="col-md-4"> <div class="card-right mt-3"> <div class="post-title text-center"><h3><%= @post.caption %></h3></div> <% if user_signed_in? %> <% if @post.user_id == current_user.id %> <%= link_to post_path(@post), method: :delete, class: "btn btn-danger ml-auto mx-0 my-auto" do %> <div>画像削除</div> <% end %> <% end %> <hr> <h5 class="text-center">投稿ユーザー</h5> <div class="text-center post-user"> <%= link_to user_path(@post.user) do %> <% if @user.image? %> <%= image_tag @user.image.thumb.url, class: "round-img" %> <% else %> <%= image_tag "/assets/default.jpg", class: "round-img" %> <% end %> <% end %> <%= link_to user_path(@post.user), class: "black-color no-text-decoration post-user-name", title: @post.user.name do %> <strong> <%= @post.user.name %></strong> <% end %> <% end %> </div> </div>
自分でやってみたが、解決できなかったこと
1,photos_controllerのdef showにrender templete :users/show'を書き、メソッドを呼び出してみた
2,UsersコントローラーをPhotosコントローラーの親クラスにした
3,<% if @user.image? %>
<%= image_tag @user.image.thumb.url, class: "round-img" %>
<% else %>
<%= image_tag "/assets/default.jpg", class: "round-img" %>
<% end %>
このコードの<%= image_tag "/assets/default.〜
以外をコメントアウトした結果、デフォルトで設定した画像が表示された
4,photos.helperでusers.controllerのdef showをモジュールで格納し呼び出してみたがエラー
おそらくphotosコントローラーでメソッドが定義されていないことから、エラーが発生していると思うのですが、解決方法がわかりません。ご教授頂ければ幸いです。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/09/25 12:23