Проблемы с доступом к модулю Rails в каталоге /lib

Я нашел здесь много похожих вопросов, но ни один из ответов не решил мою проблему.

Я получаю следующую ошибку при загрузке моей страницы в /user/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, которая автоматически загружает файлы в каталог /lib в Rails 3:

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

Я знаю, что эта проблема вызвана тем, что модуль не загружается, но ни одно из решений, которые я нашел, не помогло мне решить мою проблему. Любая помощь приветствуется. Спасибо.


person jimmydief    schedule 24.07.2012    source источник
comment
Я смущен; что такое @videos_number? Что это за переменные в области метода и как они связаны?   -  person Dave Newton    schedule 25.07.2012
comment
@videos_number определяется позже в контроллере как длина объекта ActiveRecord и, таким образом, никогда не должно быть nil. Удаление любого кода в представлении, который может генерировать исключение нулевого указателя, приводит к отображению представления, но без каких-либо других переменных экземпляра, вызываемых в представлении, возвращающих значение, что говорит мне о том, что проблема исходит от контроллера. Переменные области действия метода на самом деле не связаны с вопросом, я просто скопировал начало 7 или около того строки модуля.   -  person jimmydief    schedule 25.07.2012


Ответы (1)


module не следует писать с заглавной буквы в начале файла analytics_helper.rb. Пытаться:

    module AnalyticsHelper
      # ...
    end
person Becky Russoniello    schedule 24.07.2012
comment
Это изменило сообщение об ошибке на: NoMethodError in UserDataController#data undefined method analytics_tracker' for AnalyticsHelper:Module Rails.root: /Users/Jimmy/Documents/Launchpad Toys/LPT_Repositories/orbit-analytics Application Trace | трассировка фреймворка | Приложение Full Trace app/controllers/user_data_controller.rb:120:in data' Строка 120 в контроллере: @user_video_analytics = AnalyticsHelper::analytics_tracker(@video_ids) поэтому я предполагаю, что теперь ошибка заключается в том, как я вызываю этот метод. - person jimmydief; 25.07.2012
comment
В порядке. Попробуйте изменить def analytics_tracker(video_ids) на def self.analytics_tracker(video_ids). В настоящее время у вас есть метод, определенный как метод экземпляра, но когда вы вызываете его с помощью AnalyticsHelper::analytics_tracker(@video_ids), вы вызываете его, как если бы это был метод класса. Добавление self к определению, как я предложил выше, официально изменит его на метод класса. - person Becky Russoniello; 25.07.2012
comment
Еще один совет по очистке кода: избавьтесь от require 'analytics_helper' в своем контроллере. include AnalyticsHelper будет достаточно :) - person Becky Russoniello; 25.07.2012
comment
На самом деле это не работает, но сработало изменение вызова только на analytics_tracker(@video_ids). Я бы предпочел, чтобы это был метод класса, а не метод экземпляра, но я достаточно счастлив, что сейчас он снова работает. Любая идея, что может заставить это не работать? Кроме того, спасибо за совет, я попытался включить оператор require, поскольку некоторые похожие ответы StackOverflow предполагали это по какой-то причине. - person jimmydief; 25.07.2012
comment
тот же NoMethodError, что и выше - person jimmydief; 25.07.2012
comment
Это должно сработать, если вы вернете префикс AnalyticsHelper:: при вызове метода, и добавите self в определение метода для analytics_tracker одновременно. - person Becky Russoniello; 25.07.2012
comment
Я делал это, и это все равно выдавало эту ошибку. Ваше решение имеет смысл и для меня, не знаю, почему это не сработает. - person jimmydief; 25.07.2012
comment
Попробуйте изменить include на extend и вызвать его с помощью AnalyticsHelper.analytics_tracker(@video_ids) - person Becky Russoniello; 25.07.2012
comment
Я только что добавил в модуль еще один метод find_by_age и теперь получаю NoMethodError undefined method 'find_by_age' for #<UserDataController:0x007fbbec83b648> при вызове этой функции из того же контроллера точно так же, как и функция analytics_tracker. Я крайне смущен этим. - person jimmydief; 25.07.2012
comment
Пробовал использовать extend с self и без него перед методами в модуле, но это не сработало. Я также изменил вызовы методов. - person jimmydief; 25.07.2012
comment
У меня нет идей ... Возможно, проблема заключается в другом в вашем коде, чем то, что вы поделились здесь. Я бы прочитал о включении/расширении, а затем поэкспериментировал с ним в IRB или в отдельном файле... сначала создал очень простой класс, который включает простой модуль, а затем медленно добавлял вещи, чтобы сделать его все более и более похожим на настоящий. ситуация... это моя личная стратегия, которая обычно дает много полезных идей. В любом случае удачи! - person Becky Russoniello; 25.07.2012
comment
Спасибо, я уже потратил пару часов методом проб и ошибок. Простое копирование методов в контроллер заставляет все работать идеально, поэтому мне кажется, что ошибка заключается в том, как на них ссылаются, а не в том, как написаны сами методы. В любом случае, спасибо за вашу помощь. - person jimmydief; 25.07.2012