我在我的一个项目中收到以下错误:表单中的第一个参数不能包含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
任何帮助都将不胜感激!感谢您抽出时间!!!