URI запроса доступа в пользовательском классе библиотеки в Rails - PullRequest
0 голосов
/ 25 декабря 2010

Я использую класс, определенный в lib/myclass.rb, и мне нужен доступ к URI запроса в одном из его методов.Есть ли константа с URI, к которой можно получить доступ из моего класса, или мне нужно определить ее самостоятельно?Где и как я могу сделать определение (кроме как в контроллере или представлении)?

ОБНОВЛЕНИЕ:

Следующий метод решает проблему с помощью переменной класса, как предложено Жестяным Человеком

# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery
  before_filter :define_uri

  def define_uri
    MyClass.uri request.fullpath
  end
end

# lib/myclass.rb
def MyClass.uri u
  @@uri = u
end

Однако,

Я по-прежнему заинтересован в получении URI запроса вне контроллера.Есть идеи как?

Ответы [ 2 ]

2 голосов
/ 26 декабря 2010

Быстрый, но "неправильный" ответ : Определите фильтр до в вашем контроллере, который вставляет uri в Thread.current ... в основном устанавливая глобальную переменную, безопасную для потокаВы можете получить доступ к Thread.current из любого места.

Это нежелательно, поскольку он связывает класс с циклом запроса / ответа и глобальным состоянием.Представьте себе, что вы пытаетесь выполнить юнит-тестирование этого класса, и вы начнете понимать, почему это плохо.API для использования этого класса теперь "munge этой глобальной переменной, а затем вызовите этот метод."в инициализацию класса, если это нужно нескольким методам.

1 голос
/ 26 декабря 2010

Предполагая, что URI инициализирован / сохранен в том же классе, вам придется определить его самостоятельно.

Если URL-адрес определен при инициализации класса, создайте переменную класса или экземпляра.Все методы смогут увидеть его.

Переменная экземпляра:

class Blah
  def initialize(url)
    @url = url
  end

  def method1
    url = @url
  end
end

Переменная класса:

class Blah
  @@url = nil
  def initialize(url)
    @@url = url
  end

  def method1
    url = @@url
  end
end

Если URL-адрес принадлежит другому классу, то вы 'Придется использовать любой метод доступа, предоставляемый этим классом.Если его нет, вы можете попробовать что-то вроде OtherClass::URL_variable, где вы найдете имя переменной URL-адреса, просмотрев исходный код или расширив этот класс для предоставления средства доступа.

...