Ruby on rails 为什么这之前的行动不起作用?轨道

Ruby on rails 为什么这之前的行动不起作用?轨道,ruby-on-rails,Ruby On Rails,我试图在我的代码中应用DRY,但不起作用。在方法show、edit、update和delete中,我必须实现一个findby id。我创建了一个名为“set_book”的私有方法,并实现了“before_action”。这似乎是对的,但观点不起作用。例如,在节目中,似乎并没有“按id查找” 书籍中的命名错误#展示 显示/home/morganaborges/code/MorganaTBorges/bamboleio_project/app/views/books/show.html.erb,其中

我试图在我的代码中应用DRY,但不起作用。在方法show、edit、update和delete中,我必须实现一个findby id。我创建了一个名为“set_book”的私有方法,并实现了“before_action”。这似乎是对的,但观点不起作用。例如,在节目中,似乎并没有“按id查找”

书籍中的命名错误#展示 显示/home/morganaborges/code/MorganaTBorges/bamboleio_project/app/views/books/show.html.erb,其中第2行出现: nil:NilClass的未定义方法“name”

class BooksController < ApplicationController
  before_action :set_book, only: %i[show, edit, update, delete]

  def index
    @books = Book.paginate(:page => params[:page], per_page: 10)
    @active_books = @books.select { |book| book.deleted === nil }
  end

  def show
  end

  def new
    @book = Book.new
  end

  def create
    @book = Book.new(book_params)
    @book.created_by = current_user.id
    if @book.save
      redirect_to book_path(@book), notice: 'O livro foi criado com sucesso.'
    else
      render :new
    end
  end

  def edit
  end

  def update
    @book.updated_by = current_user.id
    if @book.update(book_params)
      redirect_to @book, notice: 'O livro foi editado com sucesso.'
    else
      render :edit
    end
  end

  def delete
    @book.deleted = 1
    @book.save
    redirect_to books_url, notice: 'O livro foi removido com sucesso.'
  end

  def deleted
    @books = Book.paginate(:page => params[:page], per_page: 10)
    @deleted_books = @books.select { |book| book.deleted === 1 }
  end


  private

  def book_params
    params.require(:book).permit(:name, :title, :featured, :minimum_age, :maximum_age, :key_words, 
                                :link, :summary, :format, :cover, :tips, :audio, :subtitle, :video,
                                :status, :start_online, :end_online, :deleted)
  end

  def set_book
    @book = Book.find(params[:id])
  end

end

class BooksControllerparams[:page],每页:10)
@active|books=@books.select{| book | book.deleted===nil}
终止
def秀
终止
def新
@书
终止
def创建
@book=book.new(book\u参数)
@book.created\u by=当前用户id
如果@book.save
将_重定向到book_路径(@book),注意:'O livro foi criado com successo'
其他的
渲染:新
终止
终止
定义编辑
终止
def更新
@book.updated\u by=当前用户id
如果@book.update(book_参数)
重定向到@book,注意:'O livro foi editado com successo'
其他的
渲染:编辑
终止
终止
def删除
@book.deleted=1
@保存
重定向至图书url,注意:“O livro foi removio com successo。”
终止
删除def
@books=Book.paginate(:page=>params[:page],每页:10)
@已删除的书籍=@books.select{| book | book.deleted==1}
终止
私有的
def book_参数
参数要求(:书)。许可证(:姓名,:标题,:特色,:最小年龄,:最大年龄,:关键字,
:链接,:摘要,:格式,:封面,:提示,:音频,:字幕,:视频,
:状态,:开始联机,:结束联机,:已删除)
终止
def set_书
@book=book.find(参数[:id])
终止
终止
更改

before_action :set_book, only: %i[show, edit, update, delete]

解释

2.6.5 :001 > %i[show, edit, update, delete]
 => [:"show,", :"edit,", :"update,", :delete]
2.6.5 :002 > %i[show edit update delete]
 => [:show, :edit, :update, :delete]
因此,在您的情况下,
set\u book
方法不是调用
show
方法,而是调用
show,
&因此它可能不适合您


注意:-您应该在show.html.erb中使用
@book.name
粘贴show.html.erb的代码。看起来您键入了一个不存在的书籍的url。创建一本书,获取其id,然后将该id键入URL。现在应该可以了。
2.6.5 :001 > %i[show, edit, update, delete]
 => [:"show,", :"edit,", :"update,", :delete]
2.6.5 :002 > %i[show edit update delete]
 => [:show, :edit, :update, :delete]