2015-08-14 33 views
1

我在我的項目上收到以下錯誤:表單中的第一個參數不能包含零或爲空。我正在嘗試爲我的代碼創建一個編輯頁面。 Rails相當新穎,並嘗試在沒有腳手架的情況下學習。Rails 4:收到以下錯誤:表單中的第一個參數不能包含零或爲空

控制器:

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 

模型Page:(對於書)

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

模型Page:(對於作者)

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 

任何幫助將不勝感激!感謝您的時間!!!

+0

您正在編輯的書可能不在您的數據庫中。您的網址中的圖書ID是什麼?你確定這本書存在於你的數據庫中嗎?您可以通過Rails控制檯進行確認。 –

+0

在添加編輯功能之前,我確實在我的數據庫中有書。一旦我添加了編輯功能,我刪除了書籍,然後添加了一個。 (這是一本ID爲14的書,它是數據庫中唯一的一本書,我可以在我的顯示頁面上點擊它的編輯按鈕,那就是當我得到死亡的紅色頁面時 –

+0

即使我添加了一本新書,我剛剛做了,我得到以下錯誤信息:當我點擊它的編輯按鈕時,無法找到帶有'id'= id的書。令人沮喪但是學習的痛苦的一部分 –

回答

0

此錯誤表示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" %>

+0

不知道這是對的,但確實如此:<%= form_for(@book).nil? do | f | %>仍然會得到相同的錯誤。我同意我不認爲選項2是問題。我認爲你在一起。我知道這本書是在數據庫中,但它只是沒有把它拉起來。儘管謝謝您的幫助! –

+0

在調用'form_for'之前檢查'@ book'是否爲'nil' - 如果是的話,甚至不要調用'form_for'。相反,顯示某種錯誤。我通常會檢查它是否在控制器內部,並完全重定向到不同的頁面。 – Sculper

+0

仍然收到錯誤消息無法找到書與'id'= ID與@ book.nil? –

0

假設書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. 再次,假設本書是一個寧靜的資源,當您運行rake_routes,你應該看到編輯路徑爲edit_book_path
  2. 您需要將book實例與路徑一起傳遞,以便Rails知道您希望編輯哪個對象。

我找到了正確的語法here

希望這會有所幫助。

+0

偉大的作品!感謝您的幫助! –

相關問題