NoMethodError in ‹myController›#‹myMethod› неопределенный метод `‹myModuleMethod›’ для ‹myModule›

извините за основы, но у меня чертовски много времени, чтобы заставить работать очень простой поток:

1) Определите модуль с методом сохранения URL-адреса в var (или его возврата)

2) Вызовите этот метод в контроллере, чтобы инициализировать метод

3) Покажите этот URL в представлении

NoMethodError в AuthController#oauth неопределенный метод `oauthurl' для GetAccessToken:Module

Модуль: \lib\get_access_token.rb

module GetAccessToken
    CONSUMER_TOKEN = { :token=>"mytokenstringwhichisreallylong", :secret=> "mysecretstringwhichisreallylong" }
    def self.oauthurl    
      @oauthurl="https://us.etrade.com/e/t/etws/authorize?key=#{(CONSUMER_TOKEN[:token])}&token="
    end
end

Контроллер: app\controllers\auth_controllers.rb

require 'get_access_token'
class AuthController < ApplicationController
include GetAccessToken
before_filter :oauthurl1
    def oauthurl1
        GetAccessToken.oauthurl
    end
end

Вид: app\views\auth\oauth.html.erb

<% provide(:title, 'oAuth') %>
<h1>oAuth</h1>
<%= link_to "oAuth", @oauthurl %>

Моя цель более высокого уровня — заставить работать поток eTrade oAuth, но я хочу убедиться, что понимаю каждую строку кода, а не беру чужую, и я пока не могу заставить этот базовый строительный блок работать.


person John Kucera    schedule 01.04.2013    source источник


Ответы (3)


Добавьте в config/application.rb следующее:

config.autoload_paths += Dir["#{config.root}/lib/**"]

Измените свой AuthController на:

class AuthController < ApplicationController
  include GetAccessToken

  def oauthurl1
    GetAccessToken.oauthurl
  end
end
person pdoherty926    schedule 01.04.2013
comment
Спасибо - я тоже пробовал эту перестановку (добавление строки конфигурации в application.rb; инициализация oauthurl1), но, к сожалению, у меня это тоже пока не сработало - та же ошибка. - person John Kucera; 01.04.2013

Ваш код модуля будет

module GetAccessToken
  CONSUMER_TOKEN = { :token=>"mytokenstringwhichisreallylong", :secret=> "mysecretstringwhichisreallylong" }
  def self.oauthurl    
    "https://us.etrade.com/e/t/etws/authorize?key=#{(CONSUMER_TOKEN[:token])}&token="
  end
end

и ваш код контроллера должен быть

require 'get_access_token'

class AuthController < ApplicationController
  include GetAccessToken

  def oauthurl1
    @oauthurl = GetAccessToken.oauthurl
  end
end

Нам нужно инициализировать @oauthurl в контроллере, чтобы использовать эту переменную в представлении, иначе она будет nil.

person Sagar Bommidi    schedule 01.04.2013
comment
Спасибо за быстрый ответ! Я переместил включенное и забыл упомянуть, что у меня была строка before_filter :oauthurl1 для инициализации метода @oauthurl, но я все еще получаю ту же ошибку с моим обновленным кодом. - person John Kucera; 01.04.2013
comment
Я закончил тем, что использовал что-то довольно близкое к этому. Спасибо еще раз за помощь! - person John Kucera; 04.04.2013

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

Модель:\lib\test_module.rb

module TestModule
    CONSUMER_TOKEN = { :token=>"myReallyLongToken", :secret=> "myReallyLongSecret" }

    def self.testUrl
        "https://us.etrade.com/e/t/etws/authorize?key=#{(CONSUMER_TOKEN[:token])}&token="
    end
end

Контроллер: app\controllers\test_controller.rb

require 'test_module'

class TestController < ApplicationController
  include TestModule

  before_filter :testUrl1Init

  def testUrl1Init
    @testurl=TestModule.testUrl
  end
end

Представление: \app\views\test\test.html.erb

<% provide(:title, 'test') %>
<h1>test</h1>
<%= link_to "test link", @testurl %>
person John Kucera    schedule 04.04.2013