Map.resources nie działa w Rails 2.1?

Mam kontroler (skopiowany bezpośrednio z dokumentacji Rails)

[code]# dictionaries_controller.rb
class DictionariesController < ApplicationController

GET messages_url

def index
end

GET new_message_url

def new
end

POST messages_url

def create
end

GET message_url(:id => 1)

def show
end

GET edit_message_url(:id => 1)

def edit
end

PUT message_url(:id => 1)

def update
end

DELETE message_url(:id => 1)

def destroy
end
end[/code]
W routes.rb mam

[code]ActionController::Routing::Routes.draw do |map|
map.resources :dictionaries

komentarze usunąłem

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’
end[/code]
A wynik w przeglądarce:

[code]ArgumentError
wrong number of arguments (4 for 3)

RAILS_ROOT: C:/Users/leszek/Desktop/rails_root/dkt_test
Application Trace | Framework Trace | Full Trace
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/option_merger.rb:14:in named_route' c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/option_merger.rb:14:insend!’
c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/option_merger.rb:14:in method_missing' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/resources.rb:494:inmap_default_collection_actions’
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/resources.rb:434:in map_resource' c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.1.0/lib/active_support/core_ext/object/misc.rb:48:inwith_options’
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/resources.rb:432:in map_resource' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/resources.rb:351:inresources’
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/resources.rb:351:in each' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.1.0/lib/action_controller/resources.rb:351:inresources’
config/routes.rb:3
config/routes.rb:1
This error occurred while loading the following files:
C:/Users/leszek/Desktop/rails_root/dkt_test/config/routes.rb[/code]
Naprawdę nie wiem co robię źle. Wszystko skopiowane z dokumentacji Rails. W routes.rb odkomentowałem tylko linię i zmieniłem symbol.
Ruby: 1.8.6 Rails: 2.1.0

Wklej output z
rake routes

Bez feralnego map.resource jest ok.

C:\Users\leszek\Desktop\rails_root\dkt_test>rake routes (in C:/Users/leszek/Desktop/rails_root/dkt_test) /:controller/:action/:id /:controller/:action/:id.:format
A z map.resource się wywala

C:\Users\leszek\Desktop\rails_root\dkt_test>rake routes (in C:/Users/leszek/Desktop/rails_root/dkt_test) rake aborted! wrong number of arguments (4 for 3)

Sorry. Nie szukajcie. Moja wina.
Miałem dla klasy Hash nadpisaną metodę respond_to? .
Jak to usunąłem działa jak należy.

Nauczka. Monkey patching się nie opłaca zwłaszcza u początkującego :frowning:

Wolę nie wnikać po co w ogóle nadpisywać tą metodę :wink:

Monkeypatching NIGDY się nie opłaca. Kropka.

Monkey patching is a root of all evil!

Się śmiej, ale jeszcze nie spotkałem się z monkeypatchem, który by czegoś nie rozwalał. Z reguły po cichu i w sposób, który wyłazi dopiero po kilku kwadransach debugowania.
Na przykład plugin validates_date_time - nadpisuje railsowe parsery dat i oczywiście robi to tak nieudolnie, że lepiej o tym pluginie zapomnieć.

Tomaszh, ale ja to jak najbardziej poważnie napisałem. Także uważam MP za coś złego.

OK:

[code=ruby]module XMLRPC
module ParseContentType
def parse_content_type(str)
if str.nil? or str == ‘text/plain’
str = ‘text/xml; charset=utf-8’
end

  a, *b = str.split(";")
  return a.strip, *b
end

end
end[/code]
Monkeypatch, który niczego nie rozwala, a rozwiązuje problem zbyt dumnych, żeby poprawić swój kod, developerów J2EE.
Konkretnie - XMLRPC w odpowiedziach nie wstawiało Content-Type albo wstawiało text/plain.

Dramatyzujecie i tyle :wink: MP pozwala na wieksza swobode grzebania w cudzym kodzie w “runtime”. Na tej samej zasadzie przeciez dziala caly DataMapper, np include DataMapper:Resource w klasie, mixiny, RAILS!. Budowana jest np podstawowa klasa ActiveRecord:Base ktora potem jest rozszerzania np przez named_scope. Prawie kazdy plugin do Rails to MP. Wiec moje pytanie… dlaczego uwazacie to za cos zlego jesli na okraglo z tego korzystacie ;]

Jesli spojrzec na definicje MP to w zasadzie kazdy plugin do oprogramowania nawet pisane w c podchodzi pod definicje. MP to po prostu rzecz z ktora trzeba sie umiec obchodzic. Stwierdzenia typu “Rails jest be bo ma syf w pluginach i nigdy nie dzialaja po updejcie rails” swiadczy o tym ze wiele osob nadal chyba nie rozumie jakie sa podstawowe wady pisania pluginow :slight_smile: Zwlaszcza w Rails ktore nie ma api(abi?) ktore moglo by zamrazac i okreslac kiedy kompatybilnosc pluginow bedzie zapewniona, a kiedy nie. Ale ja sie z tego ciesze, jesli by takie api posiadalo… i je zamrazalo co poltora roku to dzis pewnie 60 % funkcjonalnosci czekalo by na rails 3.0 a nie siedzialo by juz w rails 2.3. Cos za cos :wink:

http://en.wikipedia.org/wiki/Monkey_patch w sumie podpunkt drugi w Application wyklucza MP z wlasnego kodu. MP jest wtedy keidy poprzez plugi zmieniamy kod rails.

Wniosek: Jesli czego brakuje w rails, testuj to na pluginie, potem przygotuj patch i licz na ze wejdzie to do trunk’a ;]

MP to modyfikacja cudzego kodu. Otwierasz klasy String, Hash, Array? Robisz MP (to nie jest Twój kod). Miksowanie we własnych klasach nie jest MP.

+1
Domiksowywanie to nie MP, zwłaszcza że metody dołączone z zaincludowanego modułu nie przesłaniają (są przysłonięte przez) metod zaimplementowanych w danej klasie.

Ale za to miksowanie dodatkowych metod w cudzych klasach to jest MP.

Amen

Ja czasami używam MP :slight_smile:

Chociażby ostatnio do wrzucenia obsługi rodzaju, do tłumaczeń w rails i18n. Jakby odpowiednio ponaciskać na developerów, to bardzo możliwe, że wrzucą takie coś, ale do tej pory trzeba sobie jakoś radzić.

Można zrobić plugin, który używając alias_method_chain dorzuci do generowania komunikatów o błędach jedną kilka linijek, albo zforkować sobie railsy tam zmienić kod i trzymać cały czas swoją unikalną wersję w vendor rails. Tylko ciężko wtedy to ogarnąć, szczególnie, że takich “pluginów” możemy potrzebować kilka i to nie tylko pisanych przez siebie.

Oczywiście, na dłuższą metę MP jest takim rozwiązaniem na supełek i zgadzam się z tym co mówicie, ale świat nie jest różowy i dopóki dany kawałek kodu w railsach nie będzie na tyle elastyczny, żeby można było sobie podpiąć swój własny kod, wrzucić alternatywny backend, czy coś w tym stylu, to trzeba to jakoś rozwiązać. Grunt, żeby nie przesadzić.

Swoją drogą developerzy railsów mogliby się dużo nauczyć od javascriptowców. Większość pluginów do jquery czy script.aculo.us ma zdefiniowane duże ilości callbacków i opcji konfiguracyjnych przez co rzadko trzeba się uciekać do modyfikowania kodu pluginu.

Nie :slight_smile:
To robią nagminnie Railsy i nikt od tego nie ucierpiał - patrz na rozszerzenia klas String, Integer (15.minutes), Date/Time i ogólnie cały ActionPack.
Póki nie przesłania się oryginalnych metod, to można roszerzać do woli :slight_smile:

Nie :slight_smile:
To robią nagminnie Railsy i nikt od tego nie ucierpiał - patrz na rozszerzenia klas String, Integer (15.minutes), Date/Time i ogólnie cały ActionPack.[/quote]
To, że railsy robią to nie znaczy, że robią to dobrze.

A skąd wiadomo, że nie przesłaniają? Wystarczy, że dołączysz inną bibliotekę, która robi coś podobnego i może być niefajnie. Poza tym nigdy nie można być pewnym, zmieniając cudze klasy, że w przyszłości ona nie zdefiniuje takie same metody, jakie my dodajemy.

Nie :slight_smile:
To robią nagminnie Railsy i nikt od tego nie ucierpiał - patrz na rozszerzenia klas String, Integer (15.minutes), Date/Time i ogólnie cały ActionPack.[/quote]
To, że railsy robią to nie znaczy, że robią to dobrze.[/quote]
To juz raczej kwestia opinii ;] jesli z tego korzystasz, to zgadzasz sie na taki MP i raczej nie uznal bys tego za cos zlego, bo zaprzeczal bys wtedy sam sobie :stuck_out_tongue: (korzystasz z rails?)