Почему я получаю эту ошибку noMethodError? - PullRequest
0 голосов
/ 01 апреля 2011

Это ошибка:

NoMethodError in VideosController#update

undefined method `each' for #<Topic:0x1032ee330>

Это трассировка приложения:

app/models/video.rb:19:in `assign_topics'
app/controllers/videos_controller.rb:41:in `update'
app/controllers/videos_controller.rb:40:in `update'

Это мой assign_topics метод:

def assign_topics
  if @topic_names
    self.topics = Topic.find_or_create_by_name(@topic_names)
  end
end

Примечаниечто я следую за этим: http://media.railscasts.com/videos/167_more_on_virtual_attributes.mov

Вот метод обновления видеоконтроллера:

def update
    @video = current_user.videos.find(params[:id])

    respond_to do |format|
      if @video.update_attributes(params[:video])
        format.html { redirect_to(@video, :notice => 'Video was successfully updated.') }
      else
        format.html { render :action => "edit" }
      end
    end
  end

Ответы [ 2 ]

0 голосов
/ 01 апреля 2011

Я предполагаю, что ваш метод assign_topics виноват.Topic.find_or_create_by_name вернет один экземпляр Topic, затем вы присваиваете его self.topics, а self.topics, вероятно, ожидает Array (или некоторый другой Enumerble);затем позже процесс обновления попытается перебрать self.topics, используя each, и вы получите ошибку.

В комментарии вы упоминаете, что пытались что-то вроде этого:

self.topics = @topic_names.each { |n| Topic.find_or_create_by_name(n) }

Но это не сработает, потому что each возвращает исходный массив , поэтому вышеприведенное эквивалентно следующему:

@topic_names.each { |n| Topic.find_or_create_by_name(n) }
self.topics = @topic_names

и всем Topic экземплярам, ​​которые вынайденные / созданные просто выбрасываются.

Итак, вам может повезти, если вы используете collect, например:

def assign_topics
    if @topic_names
        self.topics = @topic_names.collect { |n| Topic.find_or_create_by_name(n) }
    end
end
0 голосов
/ 01 апреля 2011

Вы получаете NoMethodError Exception, потому что где-то в вашем коде вы пытаетесь зациклить, через .each(), что-то, что не является массивом / перечислимым.

Согласно вашему исключению, вы вызываете .each() для Модельного Объекта (Темы), что имеет смысл не иметь метода .each().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...