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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails 4:收到以下错误:表单中的第一个参数不能包含nil或为空相关的知识,希望对你有一定的参考价值。

我在我的项目中收到以下错误:表单中的第一个参数不能包含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开始。不确定这是否重要。

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

   #@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

任何帮助将不胜感激!感谢您的时间!!!

答案

此错误意味着form_for的第一个参数是nil值(在本例中为@book)。大多数时候我都看过这个,这是由于控制器动作不正确,但这看起来并非如此。据我所知,这是两件事之一:

  1. 您正在尝试编辑不存在的图书。在决定呈现表单之前,请对.nil?进行检查,然后呈现错误消息(或重定向)。
  2. 您的路线已损坏,edit操作未呈现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" %>

另一答案

假设书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. 同样,假设book是Restful资源,当你运行rake_routes时,你应该看到编辑的路径是edit_book_path
  2. 您需要使用路径传递book实例,以便Rails知道您要编辑哪个对象。

我找到了正确的语法here

希望这可以帮助。

以上是关于Rails 4:收到以下错误:表单中的第一个参数不能包含nil或为空的主要内容,如果未能解决你的问题,请参考以下文章

Rails 5 有很多通过实现

Rails 4 - 根据嵌套形式的第一个选择菜单中的选择动态填充第二个选择菜单

Rails 4 不使用 Remotipart 远程提交表单

Rails 4.0.0到4.1.0升级会导致错误的参数错误

Rails 嵌套表单提交但不持久化数据

Rails:使用渲染传递参数:action?