2012-07-24 73 views
0

我在这里发现了很多类似的问题,但没有一个答案解决了我的问题。访问/ lib目录中的Rails模块的问题

我在AT /用户加载我的网页收到以下错误/ 2

NoMethodError in User_data#data 

Showing /Users/Jimmy/Documents/Launchpad Toys/LPT_Repositories/orbit-analytics/app/views/user_data/data.erb where line #108 raised: 

undefined method `<' for nil:NilClass 

Extracted source (around line #108): 

105:   </div> 
106:  </div> 
107:  
108:  <% if @videos_number < 1 %><p style="font-size: 18px; margin-top: 25px;">This user has no approved videos.</p> 
109:  
110:  <% else %> 
111:   

此错误是由控制器返回的任何和所有的实例变量我在视图中调用一个空值造成的。

这里的相关负责人的开头:

class UserDataController < ApplicationController 

    require 'analytics_helper' 

    include AnalyticsHelper 

    def data 

     require "date" 

     @user_id = params[:user_id] 

的错误似乎是由控制器未能找到该模块AnalyticsHelper,这是位于LIB/analytics_helper.rb引起的。这里是模块的开头:

Module AnalyticsHelper 

    # Average analytics calculations for a given set of videos 

    def analytics_tracker(video_ids)   
     total_likes, total_views, total_flags, total_days_visible = 0, 0, 0, 0 
     total_characters, total_unique_characters, total_recurring_characters, total_custom_characters, total_custom_backgrounds = 0, 0, 0, 0, 0 
     total_energy_level, total_emotions, total_scenes, total_duration = 0, 0, 0, 0 

我已经在注释掉application.rb中是自动加载Rails中的/ lib目录下的文件3行:

config.autoload_paths += %W(#{config.root}/lib) 

我知道这个问题是由引起该模块无法加载,但我发现的解决方案都没有帮助我解决问题。任何帮助表示赞赏。谢谢。

+0

我很困惑;什么是“@ videos_number”?这些方法范围的变量是什么,它们是如何相关的? – 2012-07-24 22:06:47

+0

'@ videos_number'在控制器中稍后定义为ActiveRecord对象的长度,因此不应该为'nil'。删除视图中可能产生空指针异常的任何代码都会导致视图被呈现,但视图中调用的其他任何实例变量都不会返回值,这会告诉我问题来自控制器。方法范围变量并不真正与问题有关,我只是复制了模块的开头7行左右。 – jimmydief 2012-07-24 22:15:08

回答

2

module不应该在您的analytics_helper.rb文件的开始处大写。试试:

module AnalyticsHelper 
     # ... 
    end 
+0

这确实改变在错误消息中:'NoMethodError在UserDataController#数据 为AnalyticsHelper 未定义的方法'analytics_tracker”:模块 Rails.root:/用户/麦/文档/启动板玩具/ LPT_Repositories /轨道-分析 应用程序跟踪|框架跟踪|完整跟踪 app/controllers/user_data_controller.rb:120:in'data''控制器中的第120行是:'@user_video_analytics = AnalyticsHelper :: analytics_tracker(@video_ids)'所以我假设现在的错误在于如何我打电话给那个方法。 – jimmydief 2012-07-24 22:45:04

+0

好的。尝试将'def analytics_tracker(video_ids)'改为'def self.analytics_tracker(video_ids)'。您现在将该方法定义为一个实例方法,但是当您使用'AnalyticsHelper :: analytics_tracker(@video_ids)'调用它时,您将它称为类方法。正如我上面所建议的那样,将“自我”添加到定义中会正式将其更改为类方法。 – 2012-07-24 22:56:25

+0

清理代码的另一个提示是:在你的控制器中去掉'require'analytics_helper''。 '包括AnalyticsHelper'就足够了:) – 2012-07-24 22:58:21