вівторок, 1 лютого 2011 р.

АМФ неаутентифицированный

Часто происходят такие ситуации, о которых-то негде и почитать. Что-нибудь такое интересное. И по прошествии времени я часто забываю как и что делал. Или же просто записываю для себя. Мне кажется, что другим такие вещи тоже могут быть интересны и полезны. Поэтому, я, наверное, буду записывать резюме подобных "внештатных" ситуаций и процессов их решения.

Начну с экстравагантного случая с Rails 2.3.5, Devise 1.0.9 и RubyAMF
непонятно-какой-версии (http://code.google.com/p/rubyamf/). Уже больше года были рельса и рубиамф, потребовалось сделать аутентификацию пользователей. Естественно, выбрал devise. Подключил, настроил, всё ок. Запускаю приложение, хочу зарегать пользователя, получаю:

ArgumentError in SessionsController#new

wrong number of arguments (2 for 1)

В логе всё заканчивается на
path-to-gems/devise-1.0.9/lib/devise/controllers/internal_helpers.rb:123:in `render' 

Смотрю в 
internal_helpers.rb:123
, там:

render action, :controller => controller_name

Далее лезу в 
 
path-to-gems/actionpack-2.3.5/lib/action_controller/base.rb
 
 
, нахожу:

def render(options = nil, extra_options = {}, &block)
Хм... Два параметра и блок, как и требуется. Непонятно, небольшой ступор.

Потом я просветляюсь и понимаю, что кто-то переопределил метод render. Просматриваю lib. Ничего. С помощью джедайского поиска в NetBeans нахожу все вхождения 'render' в каталоге vendor. Ещё пару минут сортировки результатов поиска и, - вуаля, - вот он виновник:

vendor/plugins/rubyamf/util/action_controller.rb

ActionController::Base.class_eval do
  def render_with_amf(options = nil, &block)
    ...
  end
  alias_method_chain :render, :amf
end
Действительно, переопределён render, который теперь принимает один параметр и блок. Возвращаю всё на круги своя - добавляю второй параметр: 
def render_with_amf(options = nil, stub=nil, &block)

Запускаю, всё ок. 

И на последок самое интересное. Проект rubyamf, оказывается, переехал на github. Захожу на его страницу, нахожу 
util/action_controller.rb
и вижу... что аффтар уже проделал всю работу и исправил код:


https://github.com/victorcoder/rubyamf_plugin/blob/master/util/action_controller.rb


 
 
def render_with_amf(options=nil, extra_options={}, &block)
 
 

Отсюда мораль: манкипатчить хорошо, но обновляться полезнее:)

TODO: добавить стили для кода

Немає коментарів:

Дописати коментар