Как определить Класс контроллера, данный строку URL

Нижний camelCase является глупым и несемантическим

Использование более низкого camelCase делает имя / идентификатор («имя», используемое с этого момента) похожим на вещь из двух частей. Верхний CamelCase, однако, дает четкое указание на то, что все слова принадлежат друг другу.

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

Некоторые могут утверждать, что более низкий camelCase следует использовать для функций / процедур, особенно внутри классов. Это популярно в Java и объектно-ориентированном PHP. Тем не менее, нет никаких оснований делать это, чтобы указать, что они являются классовыми методами, потому что по тому пути, к которому они доступны , становится более чем ясно, что это именно то.

Некоторые примеры кода:

# Java
myobj.objMethod() 
# doesn't the dot and parens indicate that objMethod is a method of myobj?

# PHP
$myobj->objMethod() 
# doesn't the pointer and parens indicate that objMethod is a method of myobj?

Upper CamelCase полезен для имен классов и других статических имен. Весь нестатический контент должен распознаваться по способу доступа к ним, а не по формату имени (!)

Вот мой пример однородного кода, где поведение имен обозначается другими вещами, а не их именами ... ( Кроме того, я предпочитаю подчеркивать, чтобы разделить слова в именах.

# Java
my_obj = new MyObj() # Clearly a class, since it's upper CamelCase
my_obj.obj_method() # Clearly a method, since it's executed
my_obj.obj_var # Clearly an attribute, since it's referenced

# PHP
$my_obj = new MyObj()
$my_obj->obj_method()
$my_obj->obj_var
MyObj::MyStaticMethod()

# Python
MyObj = MyClass # copies the reference of the class to a new name
my_obj = MyObj() # Clearly a class, being instantiated
my_obj.obj_method() # Clearly a method, since it's executed
my_obj.obj_var # clearly an attribute, since it's referenced
my_obj.obj_method # Also, an attribute, but holding the instance method.
my_method = myobj.obj_method # Instance method
my_method() # Same as myobj.obj_method()
MyClassMethod = MyObj.obj_method # Attribute holding the class method
MyClassMethod(myobj) # Same as myobj.obj_method()
MyClassMethod(MyObj) # Same as calling MyObj.obj_method() as a static classmethod

Итак, мое абсолютно субъективное мнение ob о camelCase.

6
задан Ryan Bigg 1 November 2009 в 20:58
поделиться

3 ответа

Создание здесь Карлоса:

path = "/controllername/action/whatever"
c_name = ActionController::Routing::Routes.recognize_path(path)[:controller]
controllerClass = "#{c_name}_controller".camelize.constantize.new

даст вам новый экземпляр класса контроллера.

12
ответ дан 8 December 2019 в 18:40
поделиться

ActionController :: Routing :: Routes.recognize_path "/ your / path / here"

Будет печатать:

{: controller => "соответствующий_controller",: action => " Соответствующее_ действие "} # Плюс любые параметры, если они переданы

1
ответ дан 8 December 2019 в 18:40
поделиться

Я не знаю, есть ли лучший способ сделать это, но я бы попытался взглянуть на собственный код Rails.

Классы маршрутизации имеют некоторые методы утверждения, используемые при тестировании. Они получают путь и ожидаемый контроллер и утверждают, что он правильно маршрутизирует.

Глядя туда, вы должны хорошо начать свой путь.

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html # M000598

Специально эта строка

generated_path, extra_keys = ActionController::Routing::Routes.generate_extras(options, defaults)

Надеюсь, что это поможет.

Изменить:

Похоже, я указал вам на противоположный пример.

Вы хотите path => controler / action

Тогда вы следует посмотреть

http://api.rubyonrails.org/classes/ActionController/Assertions/RoutingAssertions.html#M000597

Так или иначе, я думаю, вы можете найти свое решение в этих строках :)

0
ответ дан 8 December 2019 в 18:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: