2011-03-31 25 views
0

这是错误:为什么我得到这个noMethodError错误?

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

这是视频控制LER的更新方法:

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 

回答

0

我猜你的assign_topics方法有问题。 Topic.find_or_create_by_name将返回单个Topic实例,那么您将该实例分配给self.topicsself.topics可能期望Array(或其他一些Enumerble);然后稍后,更新过程将尝试使用each循环通过self.topics,并且出现错误。

你提到,在一个评论,你的努力是这样的:

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

但是,这不会因为each returns the original array工作,所以上面是相同的:

@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

你得到一个NoMethodError Exception因为地方在你的代码试图循环,通过.each()上的东西是不是一个数组/枚举。

根据您的例外情况,您在模型对象(主题)上调用.each(),如果没有.each()方法,这会有意义。

+0

我如何才能找到这个'。每()'在我的代码?我没有看到我在做什么...... – 2011-03-31 21:01:58

+1

从你的变量名称判断,“@ topic_names”包含一个数组,你不能传递给'find_or_create_by_ *' – 2011-03-31 21:03:38

+0

是的...我尝试了类似这个:self.topics = @ topic_names.each do | name | Topic.find_or_create_by_name(名称) 结束 – 2011-03-31 21:07:14