【问题标题】:undefined method 'id' for nil:NilClass -- edit route won't worknil:NilClass 的未定义方法“id”——编辑路由不起作用
【发布时间】:2017-06-30 14:21:33
【问题描述】:

我不太确定为什么会出现错误。除了这条路线之外,其他所有路线都可以使用。

我还在下面附上了我的控制器和视图的代码

BooksController

class BooksController < ApplicationController
  get '/books' do
    if logged_in?
      @books = Book.all
      erb :'books/index'
    else
      redirect to '/login'
    end
  end

  get '/books/new' do
    if logged_in?
      erb :'books/new'
    else
      redirect to '/login'
    end
  end

  post '/books' do
    @book = Book.create(:title => params[:title], :author => params[:author])
    if @book.save
      redirect to "/books/#{@book.id}"
    else
      redirect to '/books/new'
    end
  end

  get '/books/:id' do
    if logged_in?
      @book = Book.find_by_id(params[:id])
      erb :'books/show'
    else
      flash[:message] = "Please login to access your library."
      redirect to '/login'
    end
  end

  get '/books/:id/edit' do
    if logged_in?
      @book = Book.find_by_id(params[:id])
      if @book.user_id == current_user.id
        erb :'books/edit'
      else
        redirect to '/books'
      end
    else
      redirect to '/login'
    end
  end

  patch '/books/:id' do
    if params[:title] == "" || params[:author] == ""
      redirect to "/books/#{params[:id]}/edit"
    else
      @book = Book.find_by_id(params[:id])
      @book.title = params[:title]
      @book.author = params[:author]
      @book.save
      redirect to "/book/#{@book.id}"
    end
  end

  delete '/books/:id/delete' do
    if logged_in?
      @book = Book.find_by_id(params[:id])
      @book.user_id == current_user.id
      @book.delete
      redirect to '/books'
    else
      redirect to '/login'
    end
  end

end

用户控制器

class UsersController < ApplicationController
   get '/' do
    erb :'index'
  end

  get '/users/:slug' do
      @user = User.find_by_slug(params[:slug])
      erb :'users/show'
  end

  get '/signup' do
    if !logged_in?
      erb :'users/new'
    else
      redirect to '/books'
    end
  end

  get '/login' do
    if !logged_in?
      erb :'users/login'
    else
      redirect to '/books'
    end
  end

  post '/signup' do
    @user = User.new(:username => params[:username], :email => params[:email], :password => params[:password])
    if params[:username].nil? || params[:email].nil? || params[:password].nil?
      flash[:message] = "Please fill the form completely."
      redirect to '/signup'
    else
      @user.save
      session[:user_id] = @user.id
      redirect to '/books'
    end
  end

  post '/login' do
    @user = User.find_by(:username => params[:username])
    if @user && @user.authenticate(params[:password])
      session[:user_id] = @user.id
      redirect to "/users/#{@user.slug}"
    else
      flash[:message] = "Try again."
      redirect to '/login'
    end
  end

  get '/logout' do
    if logged_in?
      session.clear
      redirect to '/login'
    else
      redirect to '/'
    end
  end

end

编辑视图

<h1> Edit Your Book </h1>

<form method="POST" action="/books/<%= @book.id %>">
  <input id="hidden" type="hidden" name="_method" value="PATCH">
  <input type="text" name="title" value="<%= @book.title %>">
  <input type="text" name="author" value="<%= @book.author %>">
  <input type="submit" value="Submit" id="submit">
</form>

【问题讨论】:

  • 我认为问题是它找不到书@book = Book.find_by_id(params[:id]) 尝试记录它并查看它是否不为空,您可以通过puts "\n\nbook = " + @book 执行它并在控制台中检查它。因为在您的编辑视图中,您尝试调用 &lt;form method="POST" action="/books/&lt;%= @book.id %&gt;"&gt; 并且如果 @book 为 nil,则 nil 类的方法 id
  • @marsie 为什么你在编辑时传递POST 方法,在你的控制器中,声明为patch '/books/: id ,它的PATCH 方法。

标签: ruby-on-rails activerecord sinatra


【解决方案1】:

这是因为您尝试访问/books/edit 而不是/books/1/edit。检查您为编辑书籍而创建的链接。

【讨论】:

    【解决方案2】:

    在您的控制器中,您已将路由定义为patch

    patch '/books/:id' do
      if params[:title] == "" || params[:author] == ""
        redirect to "/books/#{params[:id]}/edit"
      else
        @book = Book.find_by_id(params[:id])
        @book.title = params[:title]
        @book.author = params[:author]
        @book.save
        redirect to "/book/#{@book.id}"
      end
    end
    

    你的表格上写着POST,改变它..

    【讨论】:

      猜你喜欢
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2022-12-06
      • 2017-01-17
      • 1970-01-01
      • 2015-12-20
      • 2013-06-28
      • 1970-01-01
      相关资源
      最近更新 更多