0

ちょっと、私は別の問題を抱えています;)

アプリで新しい本を作成しようとすると、常に次のように表示されます

undefined method "model_name" for NilClass:Class

Form_for 関数で初期化されていないパラメーターでなければならないことがわかりました...ここに私のコード:

NoMethodError in Books#new

Showing /app/views/books/_form.html.erb where line #1 raised:

   undefined method `model_name' for NilClass:Class
   Extracted source (around line #1):

   1: <%= form_for(@book) do |f| %>
   2:   <% if @book.errors.any? %>
   3:     <div id="error_explanation">
   4:       <h2><%= pluralize(@book.errors.count, "error") %> prohibited this book from being saved:</h2>

コントローラ:

   #GET /books/new
   #GET /books/new.json
   def new
     @users = User.find(:all)
     @book = Book.new
     1.times{ @book.chapters.build }
     @book.users = [current_user]
     respond_to do |format|
       format.html #new.html.erb
       format.json { render json: @book }
     end
    end

ブックとユーザーの間の関係を変更する前は正常に機能していましたが、失敗するべきではありませんか?

編集:

app/views/books/new.html.erb :

    <h1>New book</h1>

    <%= render 'form' %>

    <%= link_to 'Back', books_path %>

そしてモデル:

   class Book < ActiveRecord::Base
            attr_accessible :abstract, :status, :titel, :user_tokens, user_ids,        :chapters_attributes

     has_and_belongs_to_many :users
     attr_reader :user_tokens

     has_many :chapters, :dependent => :destroy, :autosave => true, :order => 'slot'

     validates :title, :presence => true

     accepts_nested_attributes_for :chapters, :allow_destroy => true

     after_initialize :init
     def init
       self.status = false if self.status?
     end

     def user_tokens=(ids)
       self.user_ids = ids.split(",")
     end

   end
   end
4

1 に答える 1

0

パーシャルは、コントローラーで設定したインスタンス変数を認識しません。パーシャルをレンダリングするときに、それらをローカルとして渡す必要があります

render :partial => "form", :locals => {:book => @book}

そしてあなたのパーシャルでは、book代わりに使用してください@book

<%= form_for(book) do |f| %>
   <% if book.errors.any? %>
   <div id="error_explanation">
   <h2><%= pluralize(book.errors.count, "error") %> prohibited this book from being saved:</h2>
于 2013-07-10T21:59:56.403 に答える