課題「にURLを入力しても、他の投稿者が投稿した編集画面には遷移できないように設定してください」
というお題があるのですが、自分で調べてみてやってみて、usersのeditは手打ちを防止できたのですが、
booksのほうがSHOWからeditボタンを押してeditにはいる【edit画面で別のユーザーid_pathをアドレスバーに打ちたかった)前にroot_pathへリダイレクトされてしまします。
どちらもやっていることは同じなのになぜ、booksの方だけできないのかわかりません。
ご回答お願いいたします。
問題を要約すると
- 編集画面を手打ちで別IDへ遷移しないようにしたい
- userとbookのコントローラーにbefore_action :correct_user, only: [:edit, :update]を入れた。
- Userはできた
- bookはなぜか編集ページに入る前にリダイレクトされるようになった。
- この差と解決方法が分からない
root.rb
Rails.application.routes.draw do root 'homes#top' get 'home/about' => 'homes#about' devise_for :users, controllers: { sessions: 'users/sessions', registrations: 'users/registrations' } # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html resources :users, only: [:show, :index, :edit,:create,:update] resources :books, only: [:show, :index, :edit,:create,:update,:destroy] end
users_controller.eb(こっちはeditページに入りアドレスに別ID入力し、root_pathへリダイレクト成功)
class UsersController < ApplicationController before_action :correct_user, only: [:edit, :update] before_action :authenticate_user! def show @user = User.find(params[:id]) @book = Book.new @books = Book.where(user_id: @user.id) end def edit @user = User.find(params[:id]) end def index @user = User.find(current_user.id) @users = User.all @book = Book.new end def update @user = User.find(params[:id]) if @user.update(user_params) redirect_to user_path(@user.id),notice: "You have updated user successfully." else render :edit end end private def user_params params.require(:user).permit(:name, :introduction,:profile_image) end private def correct_user user = User.find(params[:id]) if current_user != user redirect_to root_path end end end
books_controller.rb(こっちはeditにすら入れないrootへリダイレクトされる)
class BooksController < ApplicationController before_action :correct_user, only: [:edit, :update] before_action :authenticate_user! def show @book = Book.new @book_show = Book.find(params[:id]) end def index @user = User.find(current_user.id) @books = Book.all @book = Book.new end def create @user = User.find(current_user.id) @books = Book.all @book = Book.new(book_params) @book.user_id = current_user.id if @book .save redirect_to book_path(@book.id),notice: "You have creatad book successfully." else render :index end end def edit @book = Book.find_by(params[:id]) end def destroy book = Book.find(params[:id]) book.destroy redirect_to books_path end def update @book = Book.find(params[:id]) if @book.update(book_params) redirect_to book_path(@book.id),notice: "You have updated book successfully." else render :edit end end private def book_params params.require(:book).permit(:title, :body) end private def correct_user book = Book.find(params[:id]) if current_user != book.user_id redirect_to root_path end end end
bookのshow.html.erb
<%=render'users/user_info', book: @book, user: @book_show.user %> <div class=col-md-9> <h2>Book detail</h2> <table class="table table-hover "> <tbody> <tr> <td><%= attachment_image_tag @book_show.user, :profile_image, :fill,40, 40, format: 'jpeg', class: "img-circle pull-left profile-img", fallback: "no_image.jpg" %> <%= link_to "#{@book_show.user.name}",user_path(@book_show.user.id) %></td> <td><%= @book_show.title %></td> <td><%= @book_show.body %></td> <% if @book_show.user.id == current_user.id %> <td><%= link_to "Edit", edit_book_path(@book_show.id) ,class: "btn btn-success"%></td> <td><%= link_to "Destroy", books_path,notice: "Book was successfully destroyed.", method: :delete, data: { confirm: '本当に消しますか?'} ,class: "btn btn-danger" %></td> <% end %> </tr> </tbody> </table> </div>
userのShow.html.erb
<%=render'users/user_info', book: @book, user: @user %> <div class=col-md-9> <h2>Books</h2> <table class="table table-hover "> <thead> <tr></th> <th> <th>title</th> <th>opinion</th> </tr> </thead> <tbody> <% @books.each do |book| %> <tr> <td><%= attachment_image_tag @user, :profile_image, :fill,40, 40, format: 'jpeg', class: "img-circle pull-left profile-img", fallback: "no_image.jpg" %></td> <td><%= link_to "#{book.title}",book_path(book.id) %></tb> <td><%= book.body %></tb> </tr> </tbody> <% end %> </table> </div>
どちらのShowページもeditページも
before_action :correct_user, only: [:edit, :update]
を入力しなければ開けますので、books_controllerの方が原因かと予想しております。。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/08 05:47