代码之家  ›  专栏  ›  技术社区  ›  ravenUSMC

Rails 4:收到以下错误:表单中的第一个参数不能包含nil或为空

  •  1
  • ravenUSMC  · 技术社区  · 9 年前

    我在我的一个项目中收到以下错误:表单中的第一个参数不能包含nil或为空。我正在尝试为代码创建编辑页。对于Rails来说,这是一个全新的概念,并且尝试在没有脚手架的情况下学习。

    控制器:

    class BooksController < ApplicationController
    def new
      @book = Book.new 
      @authors = Author.all
    end
    
    def edit 
      @book = Book.find(params[:id])  
    end 
    
    def show
     #Notice how the @books is plural here. 
     @books = Book.all
     @authors = Author.all
     #@books = Book.where(id: params[:id])
    end 
    
    #Create method will save new entries 
    def create 
     @book = Book.new(book_params)
     @authors = Author.all
    
     if @book.save
        flash[:success] = "Book Added to Databse!"
        redirect_to @book  
      else
        render 'new'
      end 
     end 
    
     private 
    
     #Note that this method will go up into the create method above. 
    
     def book_params 
      params.require(:book).permit(:title, :pub_date, :publisher, :author_id)
     end 
    end
    

    型号页:(用于书本)

    class Book < ActiveRecord::Base
      validates :title, :pub_date, :publisher, presence: true
      validates :title, uniqueness: true 
      belongs_to :author 
    end
    

    模型页:(作者)

    class Author < ActiveRecord::Base
      validates :name, presence: true
      validates :name, uniqueness: true 
      has_many :books 
    end
    

    编辑页面:

    <h1>Update a book entry</h2>
    
    <div class="row">
     <div class="col-md-6 col-md-offset-3">
    
       <%= form_for(@book) do |f| %> **ERROR SEEMS TO BE RIGHT HERE!!!**
         <%= render 'form' %>
    
         <div class="form-group">
          <%= f.label :title %>
          <%= f.text_field :title, class: 'form-control' %>
         </div>
    
        <div class="form-group">
          <%= f.label :pub_date %>
          <%= f.text_field :pub_date, class: 'form-control' %>
        </div>
    
        <div class="form-group">
        <%= f.label :publisher %>
        <%= f.text_field :publisher, class: 'form-control' %><br />
      </div>
    
      <div class="form-group">
        <%= f.select(:author_id, 
        @authors.collect {|a| [ a.name, a.id ]},              
        {:include_blank => 'Please select an author'}, 
        class: "form-control") %><br />
      </div>
    
       <%= f.submit 'Save Changes', class: "btn btn-primary" %> 
    
      <% end %>
     </div>
    </div>
    

    呈现表单页(_form.html.erb)

      <% if @book.errors.any? %>
       <div id="error_explanation">
        <div class="alert alert-danger">
         <h2><%= pluralize(@book.errors.count, "error") %> 
       prohibited this entry       from being saved:</h2>
       <ul>
       <% @book.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
      </div>
    
    
      </div>
     <% end %>
    

    显示页面:

        <div class="move">
       <h1>Showing Book Titles:</h1>
      </div><br />
    
     <div class="row">
      <% @books.each do |book| %>
      <div class="col-md-4">
        <div class="panel panel-default">
            <div class="panel-body">
                <h2><%= book.title %></h2> 
                <h2><%= book.publisher %></h2>
                <h2><%= book.pub_date %></h2>
                <h2><%= book.author.name %></h2>
                <h2><%= link_to "Edit", edit_path, class: "btn btn-primary" %>
            </div>
        </div>
    </div>
    <% end %>
    

    这是我的日志,告诉我出了什么问题:

    Started GET "/edit" for ::1 at 2015-08-14 16:49:17 -0400
    Processing by BooksController#edit as HTML
      Rendered books/edit.html.erb within layouts/application (2.2ms)
    Completed 500 Internal Server Error in 9ms (ActiveRecord: 0.0ms)
    
    ActionView::Template::Error (First argument in form cannot contain nil or be empty):
        3: <div class="row">
        4:   <div class="col-md-6 col-md-offset-3">
        5: 
        6:     <%= form_for(@book) do |f| %>
        7:       <%= render 'form' %>
        8: 
        9:       <div class="form-group">
      app/views/books/edit.html.erb:6:in `_app_views_books_edit_html_erb___525891009649529081_70260522100960'
    

    我会说,我已经从数据库中删除了前14本书,所以第一本书从ID 14开始。不确定这是否重要。

    最后,我尝试在edit方法中将所有这些不同的实例变量添加到控制器中:

       #@book = Book.where(id: params[:id])
       #@book = Book.find_by_id(params[:id])
       #@book = Book.all 
       #@book = Book.find_by_id(params[:id])
       #book = Book.new(book_params)
    
       #When I use the two below lines, 
      there are no error pages but create a new   entry. 
      #@book = Book.new 
      #@authors = Author.all
    

    任何帮助都将不胜感激!感谢您抽出时间!!!

    2 回复  |  直到 9 年前
        1
  •  1
  •   Ryan Clark    6 年前

    此错误意味着 form_for 是一个 nil 值(在本例中 @book ). 大多数时候,我都看到了这种情况,这是由于错误的控制器操作造成的,但这里的情况似乎并非如此。据我所知,这是两件事之一:

    1. 您正在尝试编辑一本不存在的书。做一个 .nil? 在决定呈现表单之前检查它,并呈现错误消息(或重定向)。

    2. 你的路线断了 edit 操作未呈现 编辑 看法这很可能 本案。

    编辑:

    使用模板更新后 show ,这似乎是您的问题:

    <%= link_to "Edit", edit_path, class: "btn btn-primary" %>

    我看到这有两个问题(尽管我需要看到 rake routes 以验证)。首先,您需要向编辑路径传递一个参数(如果没有它们,您的参数从何而来?)。其次,默认的路由是 edit_book_path .

    试试看:

    <%= link_to "Edit", edit_book_path(book), class: "btn btn-primary" %>

        2
  •  0
  •   steve klein    9 年前

    假设图书ID 14在您的数据库中,您应该能够导航到 localhost:3000/books/14/edit 如果你用类似 resources :books (文件 here ). 如果这不起作用,则说明您的路线没有正确定义,或者您的数据库中不存在ID为14的预订。

    在显示视图中,更改 link_to 行到:

    <%= link_to 'Edit', edit_book_path(book), class: "btn btn-primary" %>
    

    所以有两个变化:

    1. 同样,假设书是一个Restful资源,当您运行 rake_routes ,您应该看到要编辑的路径是 edit_book_path .
    2. 你需要通过 book 实例,以便Rails知道您要编辑哪个对象。

    我找到了正确的语法 here .

    希望这有帮助。