Modele w katalogach

Mam mały problem z grupowaniem modeli w katalogach.

Tworzę model dla stron statycznych:

script/generate model Static::Page

Wygenerowany został model static/page.rb i plik z migracją:

[code]class Static::Page < ActiveRecord::Base
set_table_name “static_page”
end

class CreateStaticPages < ActiveRecord::Migration
def self.up
create_table :static_pages do |t|
t.column :title, :string
t.column :content, :text
end
end

def self.down
drop_table :static_pages
end
end[/code]
Po uruchomieniu rake db:migrate w bazie danych została utworzona tabela static_pages.
Próba stworzenia rusztowania dla tego modelu

script/generate scaffold Static::Page 'admin/static/pages'

kończy się:

error Before updating scaffolding from new DB schema, \ try creating a table for your model (Static::Page) named static/pages.
bawię w ROR wersja 1.2.6

Jak w ROR-rze w prawidłowy sposób organizować modele w katalogi?

Kolejny dziwny problem:

model store/product.rb

class Store::Product < ActiveRecord::Base end
Akcja show_product w kontrolerze Index działa bez problemów:
http://localhost:3000/index/show_product

[code]class IndexController < ApplicationController

def show_product
@product = Store::Product.find :first
end
end[/code]
Natomiast akcja show_product w kontrolerze Admin::Index
http://localhost:3000/admin/index/show_product

[code]class Admin::IndexController < Admin::ApplicationController

def show_product
@product = Store::Product.find :first
end
end

class Admin::ApplicationController < ApplicationController
end[/code]
powoduje wyjątek:

[code] LoadError in Admin/indexController#show_product

Expected ./app/models/store/product.rb to define Product

RAILS_ROOT: ./script/…/config/…
Application Trace | Framework Trace | Full Trace

/var/lib/gems/1.8/gems/activesupport-1.4.4/lib/active_support/dependencies.rb:249:in load_missing_constant' /var/lib/gems/1.8/gems/activesupport-1.4.4/lib/active_support/dependencies.rb:452:inconst_missing’
/var/lib/gems/1.8/gems/activesupport-1.4.4/lib/active_support/dependencies.rb:464:in const_missing' /var/lib/gems/1.8/gems/activesupport-1.4.4/lib/active_support/dependencies.rb:260:inload_missing_constant’
/var/lib/gems/1.8/gems/activesupport-1.4.4/lib/active_support/dependencies.rb:452:in const_missing' /var/lib/gems/1.8/gems/activesupport-1.4.4/lib/active_support/dependencies.rb:260:inload_missing_constant’
/var/lib/gems/1.8/gems/activesupport-1.4.4/lib/active_support/dependencies.rb:452:in const_missing' /var/www/rails/depot/app/controllers/admin/index_controller.rb:4:inshow_product’[/code]
Aplikacja identycznie zachowuje się dla:

module Store class Product < ActiveRecord::Base end end
Po kilku próbach odkryłem, że dodanie klasy Product w store/product.rb:

[code]class Store::Product < ActiveRecord::Base
end

class Product < Store::Product
end[/code]
naprawia ten problem.
Intuicja podpowiada mi, że nie jest to zbyt dobre rozwiązanie :wink:

W environment.rb ładuję modele ze wszystkich podkatalogów:

config.load_paths += Dir[RAILS_ROOT + '/app/models/*/']

Czy zachowanie to jest z winy ROR-a 1.2.6, czy jest to po prostu moje niedouczenie?

To drugie :wink:

Masz jeszcze jakieś pytania, czy też będziesz kontynuował dzielenie się swoimi problemami i kawałkami kodu bez zapytania o cokolwiek konkretnego? :wink:

…a przeczytałeś?
Moim zdaniem parę linijek kodu jest więcej warte niż 1000 słów :wink:
Pytanie chyba jest w miarę konkretne: Jak organizować modele w katalogach (przestrzeniach) nazw i jak budować do nich rusztowania?

include Store - załatwia sprawę, niedouczenie Ruby-iego wyszło na wierzch :wink:

class ApplicationController < ActionController::Base include Store end
scaffolding muszę nieco zhackować - tworzę w katalogu głównym modeli klasę, która dziedziczy po modelu, który siedzi w podkatalogu i do którego chcę zbudować rusztowanie:

class Product < Store::Products set_table_name 'store_products' end
script/generate scaffold Product ‘admin/store/products’
Potem usuwam model Product i robię mały refektoring w kodzie wygenerowanym przez scaffold (Product -> Store::Product). Mało eleganckie, ale grunt, że działa :wink:

Jak sprawa z modelami w podkatalogach wygląda w ROR 2.x?
Przy małych projektach można sobie pozwolić na pakowanie wszystkich modeli do jednego katalogu, ale przy większych tworach organizacja taka jest niezbędna. Niestety w sieci nie znalazłem zbyt wielu materiałów na ten temat.

Czy ja wiem… bardziej zaawansowany CMS to w porywach jakieś 7-8 modeli (article, user, news etc.). Kontrolery/widoki (po cóż nam bowiem namespacy, gdybyśmy trzymali w “jednej wielkiej przestrzeni nazw”) trzeba trzymać w katalogach, to oczywiste, ale modele? Chyba że masz oddzielny model dla kontrollera powiedzmy Backend::Article i Frontend::Article :stuck_out_tongue:

Nie chcę się chwalić, ale ostatnio machnąłem projekt w Zend Framework + phpDoctrine, w którym jest ze 20 modeli :wink:

Trudno mi sobie wyobrazić wpakowanie takiej ilości modeli (plus dodatkowo ActionMailer-ów, Observer-ów) do jednego katalogu ROR-a.
Co jeśli będę chciał przenieść modele z projektu “forum” do projektu “sklep”? W obu projektach możemy mieć np. model Kategoria. Dzięki pogrupowaniu modeli unikniemy problemów z konfliktami nazw (Sklep::Kategoria, Forum::Kategoria).

W RoR chyba preferuje się: jeden projekt = jedna aplikacja (chyba, że się mylę :P) (w przeciwieństwie np. do Django czy Symfony) dlatego ja bym w ogóle modeli z różnych aplikacji nie mieszał, ale jak kto lubi :slight_smile:

W Railsach ogólnie ciężko jest z dzieleniem aplikacji na mniejsze części.

Przeczytaj to: http://ducktyped.com/2008/1/4/the-great-ruby-web-framework-multi-app-challenge