環境
Ruby 2.6.3
Rails 5.2.4.1
初学者
ローカル
Mac
やろうとしていること
showのページで投稿したユーザーのみ編集のボタンを出したい
1つめのエラーは解決しました。
下部にあった2つ目のエラーはこちらに追記
<% if @post.user_id == @current_user.id %> エラーメッセージ NoMethodError in Posts#show undefined method `id' for nil:NilClass
エラーメッセージ
NameError in PostsController#show
undefined local variable or method `post' for #PostsController:0x00007fd3e1e1b380 Did you mean? @post
@user = post.userがエラー
def show @post = Post.find_by(id: params[:id]) @user = post.user end
show.thml.erb
<div class="post-preview"> <h2 class="post-title"> <%= @post.content %> </h2> <img src="<%="/user_images/#{@user.image_name}" %>"> <img src="<%=#"/user_images/#{post.user.image_name}" %>"> <%=# link_to(@post.user.name, "/users/#{@user.id})") %> <%= link_to(post.user.name, "/users/#{post.user.id}") %> <p class="post-subtitle"> 質問中身テキストテキストテキストテキストテキストテキスト... <p> show <p class="post-meta"> Posted by </p> <a href="#"> Start Bootstrap </a> <%= @user %> <p class="post-meta"><%= @post.created_at %></p> <% if @post.user_id == @current_user.id %> <div class="post-menus"> <%= link_to("編集", "/posts/#{@post.id}/edit") %> <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %> </div> <!-- 以下の<% %>を使ってif文のendを追加してください --> <% end %> </div> <hr> <!-- Pager --> <div class="clearfix"> <a class="btn btn-primary btn-origin float-right" href="#">NEXT →</a> </div>
Posts_controoler.rb
class PostsController < ApplicationController #ログアウト時に表示しないページの設定 before_action :authenticate_user, {only: [:edit, :update, :new]} before_action :ensure_correct_user, {only: [:edit, :update, :destroy]} def index @posts = Post.all.order(created_at: :desc) end def show @post = Post.find_by(id: params[:id]) @user = post.user end # def new # if @current_user == nil # flash[:notice] = "ログインしてください" # redirect_to("/login") # end # end def new @post = Post.new end def create @post = Post.new( content: params[:content], user_id: @current_user.id ) if @post.save flash[:notice] = "質問が投稿されました。回答者にわかりやすい質問にするとよりよい回答がえ得られます!" redirect_to("/posts") else render("posts/new") end end def edit @post = Post.find_by(id: params[:id]) end def update @post = Post.find_by(id: params[:id]) @post.content = params[:content] if @post.save flash[:notice] = "変更されました。回答者にわかりやすい質問にするとよりよい回答がえ得られます!" render("/posts/edit") else render("/posts/edit") end end def destroy @post = Post.find_by(id: params[:id]) @post.destroy flash[:notice] = "質問が削除されました。" redirect_to("/posts") end # private # #paramsから欲しいデータのみ抽出 # def post_params # params.require(:post).permit(:name, :title, :content) # end def ensure_correct_user @post = Post.find_by(id:params[:id]) if @post.user_id != @current_user.id flash[:notice] = "権限がありません" redirect_to("/posts/index") end end end
Users_controoler.rb
class UsersController < ApplicationController #ログアウト時に表示しないページ設定 before_action :authenticate_user, {only: [:new, ]} #ログイン時に表示しないのページ設定 before_action :forbid_login_user, {only: [:new, :create, :login_form, :login]} #ログインユーザー before_action :ensure_correct_user,{only: [:edit, :update]} # before_action :correct_user, only: [:edit, :update, ] def index @users = User.all end def show @user = User.find_by(id: params[:id]) end def new @user = User.new end def create @user = User.new( name: params[:name], email: params[:email], image_name: "default_user.jpg", password_digest: params[:password_digest] ) if @user.save session[:user_id] = @user.id flash[:notice] = "ユーザー登録が完了しました" redirect_to("/users/#{@user.id}") else render("users/new") end end def edit @user = User.find_by(id: params[:id]) end def update @user = User.find_by(id: params[:id]) @user.name = params[:name] @user.email = params[:email] if params[:image] @user.image_name = "#{@user.id}.jpg" image = params[:image] File.binwrite("public/user_images/#{@user.image_name}" ,image.read) end if @user.save flash[:notice] = "ユーザー情報を編集しました" redirect_to("/users/#{@user.id}") else render("users/edit") end end def login_form end def login @user = User.find_by(email: params[:email], password_digest: params[:password_digest]) if @user session[:user_id] = @user.id flash[:notice] = "ログインしました" redirect_to("/") else @error_message = " メールアドレスまたはパスワードが間違っています。" @email = params[:email] @password_digest = params[:password_digest] render("users/login_form") end end def logout session[:user_id] = nil flash[:notice] = "ログアウト" redirect_to("/login") end def ensure_correct_user if @current_user.id != params[:id].to_i flash[:notice] = "権限がありません" redirect_to("/") end end # def correct_user # if @current_user.id != params[:id].to_i # flash[:notice] = "権限がありません" # redirect_to("/") # end # end # private # def correct_user # user = User.find(params[:id]) # if current_user != user # redirect_to root_path # end # end end
models/post.rb
class Post < ApplicationRecord # validates :content, {presence: true, length: {maximum: 14}} validates :content, {presence: true} validates :content, length: { maximum: 10, too_long: "入力は最大%{count}文字まで" } validates :user_id, {presence: :true} def user return User.find_by(id: self.user_id) end end
もう一箇所はまっている場所(現在上記のエラーが出ていて見れない)
<% if @post.user_id == @current_user.id %>
がエラー
user.idの idがnilのエラーだったと思います。
<% if @post.user_id == @current_user.id %> <div class="post-menus"> <%= link_to("編集", "/posts/#{@post.id}/edit") %> <%= link_to("削除", "/posts/#{@post.id}/destroy", {method: "post"}) %> </div> <!-- 以下の<% %>を使ってif文のendを追加してください --> <% end %>
試したこと。
はじめは、<% if @post.user_id == @current_user.id %>のエラーでした。
PostsController
UserController
を書き換えて試していうるうちに@user = post.userがエラーに。
@user = post.userを削除すると。
We're sorry, but something went wrong.
が出て進めなくなりました。
<% if @post.user_id == @current_user.id %>の部分は、
@post.user_id と @current_user.id をいろいろ書き換えましたがうまくいきません。
キータや参考になりそうなページも試しましたがうまくいきませんでした。
どこでハマってしまったかわからないので、記載漏れがあるかもしれません。
よろしくお願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/29 08:21
2020/03/29 08:24
2020/03/29 08:30
2020/03/29 08:36
2020/03/29 08:45
2020/03/29 09:45
2020/03/29 09:49
2020/03/29 09:54
2020/03/29 11:54
2020/03/29 12:05
2020/03/29 13:00
2020/03/29 13:13
2020/03/29 13:56