Почему что-то появляется в моем текстовом поле в Ruby on Rails и NoMethod Error неопределенный метод 'каждый'

Итак, я новичок в Ruby on Rails и создал два класса: класс контроллера Author и класс контроллера Book. У авторов есть книги, и каждая книга связана с автором.

Модель автора

class Author < ActiveRecord::Base
    has_many :books
    validates_presence_of :genres
    validates_presence_of :name
end

Модель книги

class Book < ActiveRecord::Base
    #Validations
    validates_presence_of :review
    validates_presence_of :title

    #Associations
    belongs_to :author
end

Но когда я пытаюсь добавить автора, в текстовом поле «Книга» уже есть что-то внутри.

ТЕКСТОВОЕ ПОКРЫТИЕ

#<ActiveRecord::Associations::CollectionProxy::ActiveRecord_Associations_CollectionProxy_Book:0x007fc715555eb8>

Я особенно сбит с толку, потому что я не редактировал ни единого бита шаблона, созданного new.html.erb для класса автора, — это напрямую от рендеринга «формы», которую я тоже не трогал, и поэтому я не даже уверен, где это и что происходит не так.

Автор _form.html.erb

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

      <ul>
      <% @author.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

  <div class="field">
    <%= f.label :name %><br>
    <%= f.text_field :name %>
  </div>
  <div class="field">
    <%= f.label :genres %><br>
    <%= f.text_field :genres %>
  </div>
  <div class="field">
    <%= f.label :books %><br>
    <%= f.text_field :books %>
  </div>
  <div class="actions">
    <%= f.submit %>
  </div>

И даже после того, как я заполнил данные и нажал «Отправить», это то, что отображается в моем терминале (я использую Postgresql для локального хоста)

ТЕРМИНАЛ

Started POST "/authors" for 127.0.0.1 at 2014-03-23 17:05:11 -0500
Processing by AuthorsController#create as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"LdpFtn0Tni9Qyu7jg3Zk3I3n+5EzCUeXelyifJhV460=", "author"=>{"name"=>"Harper Lee", "genres"=>"Fiction", "books"=>"To Kill A Mockingbird"}, "commit"=>"Create Author"}
Completed 500 Internal Server Error in 2ms

NoMethodError (undefined method `each' for "To Kill A Mockingbird":String):
  app/controllers/authors_controller.rb:27:in `create'

  Rendered /Users/Acorn/.rvm/gems/ruby-2.0.0-p353@librarydata/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/_source.erb (22.0ms)
  Rendered /Users/Acorn/.rvm/gems/ruby-2.0.0-p353@librarydata/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/_trace.erb (1.0ms)
  Rendered /Users/Acorn/.rvm/gems/ruby-2.0.0-p353@mlibrarydata/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (0.9ms)
  Rendered /Users/Acorn/.rvm/gems/ruby-2.0.0-p353@librarydata/gems/actionpack-4.0.3/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (35.7ms)

Это сбивает с толку, потому что у меня нет функции «каждого», о которой я знаю.

функция создания authors_controller.rb

  # POST /authors
  # POST /authors.json
  def create
    @author = Author.new(author_params)

    respond_to do |format|
      if @author.save
        format.html { redirect_to @author, notice: 'Author was successfully created.' }
        format.json { render action: 'show', status: :created, location: @author }
      else
        format.html { render action: 'new' }
        format.json { render json: @author.errors, status: :unprocessable_entity }
      end
    end
  end

Я предполагаю, что что-то идет не так в книжном классе? Как это исправить?

Заранее спасибо!!


person user3452822    schedule 23.03.2014    source источник


Ответы (1)


Не могли бы вы опубликовать свою полную форму (я полагаю, это форма author), а также две модели?

Кроме того, в вашем методе создания, почему у вас есть @author = Author.new(author_params), а не @author = Author.new(params[:author])

person Eric Norcross    schedule 23.03.2014
comment
Спасибо за быстрый ответ! Я обновил пост. И хм ха-ха я не совсем уверен? Генератор скаффолдов делает так, что @author = Author.new(author_params), поэтому я предположил, что это правильно. - person user3452822; 24.03.2014
comment
Ох, хорошо. Я взгляну. В то же время, какую версию рельсов вы используете? - person Eric Norcross; 24.03.2014
comment
Итак, чего вы пытаетесь достичь? A) Существуют ли существующие книги, которые вы собираетесь назначить author или, B) Когда создается author, вы хотите, чтобы он также создал новую book с тем, что находится в поле books? - person Eric Norcross; 24.03.2014
comment
Я думаю, что вы ищете хороший ответ здесь: http://stackoverflow.com/a/16999870/1775803 - person Eric Norcross; 24.03.2014
comment
Я использую рельсы 4.0.3 и, если честно, и A, и B? Книга не требуется для нового «автора», но если есть «книга», то также создается новая «книга». «Книги» могут быть созданы без «авторов» и будут представлять собой раскрывающееся меню, в котором вы сможете выбрать «автора», поэтому, если «автор» еще не существует, вам нужно сначала создать «автора». Таким образом, «автор» — это родитель, а «книги» — дети. Имеет ли это смысл? - person user3452822; 24.03.2014
comment
Оооо! Спасибо большое! попробую реализовать! - person user3452822; 24.03.2014
comment
Э-э, я попытался переключиться на '@author=Author.new(params[:author]), и он сказал "ActiveModel::ForbiddenAttributesError" - person user3452822; 24.03.2014
comment
Да, если вы используете рельсы 4, строительные леса правильные. Придерживайтесь author_params. Кроме того, этот ответ в ссылке, которую я разместил, предназначен для рельсов 3, у рельсов 4 может быть немного другой способ сделать это. Попробуйте поискать rails 4 has_many :through tutorial или что-то в этом роде, если вы застряли. - person Eric Norcross; 24.03.2014