2009-05-24 6 views
1

OK. Das ist verrückt.Ruby on rails Modell und Controller in verschiedenen Namespaces

Ich bin neu in RoR und ich möchte wirklich darauf eingehen, da alles, was ich bisher gesehen habe, es attraktiver macht für die Art von Arbeit, die ich mache.

Allerdings kann ich nicht scheinen sehr einfache Sache mit RoR zu erreichen.

möchte ich diese controlers:

/admin/blog/entries (index/show/edit/delete) 
/admin/blog/categories (index/show/edit/delete) 
/admin/blog/comments (index/show/edit/delete) 
... and so on 

Und diese Modelle:

Blog::Entry (table: blog_entries) 
Blog::Category (table: blog_categories) 
Blog::Comments (table: blog_comments) 
... and so on 

Jetzt habe ich schon, obwohl ziemlich viel Elend gegangen, diese Arbeit zu machen. Mein erster Versuch war Gerüste zu erzeugen (ich benutze 2.2.2). Ich habe mein Gerüst erzeugt, musste aber mein Modell bewegen und dann die Referenzen auf das Modell in meinem Controller fixieren (siehe Ruby on Rails model inside namespace can't be found in controller).

Das ist schon ein großer Schmerz, aber hey, ich habe es zur Arbeit gebracht. Nun, obwohl form_for nicht funktioniert und ich nicht herausfinden kann, wie man die URL-Helfer benutzt (ich habe keine Ahnung, wie diese heißen ... sie sind die automatisch generierten Methoden, die URLs an Controller zurückgeben, die mit einem Modell verbunden sind). Ich kann nicht herausfinden, wie sie heißt. Mein Model ist Blog :: Einträge. Ich habe versucht, mit der Ressourcenmethode der route.rb-Karte zu verfahren, aber kein Glück. Wenn ich versuche, form_for mit meinem Modell zu verwenden, erhalte ich diesen Fehler

undefined method `blog_entries_path' for #<ActionView::Base:0xb6848080> 

Jetzt. Das ist wirklich ziemlich frustrierend. Ich werde die Organisation meines Codes nicht komplett zerstören, um dieses Framework zu verwenden, und wenn ich nicht herausfinden kann, wie ich diese einfache Aufgabe bewerkstelligen soll (ich habe das für mindestens 5 Stunden recherchiert), kann ich einfach nicht weitermachen.

Gibt es irgendwelche Ideen, wie dies zu erreichen ist?

Dank

EDIT

Hier sind meine Routen:

   admin_blog_entries GET /admin_blog_entries     {:controller=>"admin_blog_entries", :action=>"index"} 
    formatted_admin_blog_entries GET /admin_blog_entries.:format   {:controller=>"admin_blog_entries", :action=>"index"} 
           POST /admin_blog_entries     {:controller=>"admin_blog_entries", :action=>"create"} 
           POST /admin_blog_entries.:format   {:controller=>"admin_blog_entries", :action=>"create"} 
      new_admin_blog_entry GET /admin_blog_entries/new    {:controller=>"admin_blog_entries", :action=>"new"} 
formatted_new_admin_blog_entry GET /admin_blog_entries/new.:format  {:controller=>"admin_blog_entries", :action=>"new"} 
      edit_admin_blog_entry GET /admin_blog_entries/:id/edit   {:controller=>"admin_blog_entries", :action=>"edit"} 
formatted_edit_admin_blog_entry GET /admin_blog_entries/:id/edit.:format {:controller=>"admin_blog_entries", :action=>"edit"} 
       admin_blog_entry GET /admin_blog_entries/:id    {:controller=>"admin_blog_entries", :action=>"show"} 
    formatted_admin_blog_entry GET /admin_blog_entries/:id.:format  {:controller=>"admin_blog_entries", :action=>"show"} 
           PUT /admin_blog_entries/:id    {:controller=>"admin_blog_entries", :action=>"update"} 
           PUT /admin_blog_entries/:id.:format  {:controller=>"admin_blog_entries", :action=>"update"} 
           DELETE /admin_blog_entries/:id    {:controller=>"admin_blog_entries", :action=>"destroy"} 
           DELETE /admin_blog_entries/:id.:format  {:controller=>"admin_blog_entries", :action=>"destroy"} 
          home  /         {:action=>"index", :controller=>"index"} 
             /:controller/:action/:id 
             /:controller/:action/:id.:format 

Das ist richtig dosn't aussehen. Hier ist meine routes.rb (Kommentare entfernt):

ActionController::Routing::Routes.draw do |map| 

    map.resources :admin_blog_entries 

    map.home '', :controller => 'index' 

    map.connect ':controller/:action/:id' 
    map.connect ':controller/:action/:id.:format' 
end 
+1

Aus Interesse, haben Sie andere Eintrag, Kategorie und Kommentar-Modelle in Ihrer Anwendung? Ich bin neugierig, warum Sie sich entschieden haben, sie in einen Namensraum zu setzen. –

+0

Setzen Sie den Namespace in das Formular für und verlinken? form_for (: Blog, @entry) tun usw. Obwohl Sie möglicherweise besser mit verschachtelten Assoziationen arbeiten. Es sieht so aus, als ob du es überkomplizierst. – Jarrod

+0

John: Ich mag es, meine Projekte so zu organisieren, dass jedes "Modul" getrennt ist. Verwenden Sie stattdessen Unterstriche (blog_entries, blog_categories), die ich in einen separaten Ordner legen möchte. – nlaq

Antwort

2

haben Sie versucht, Blick auf den Routen Liste, dass „Rake Routen“ Sie gibt? Wenn Ihre routes.rb korrekt ist, sollte sie den richtigen Namen für die Route der Blog-Einträge anzeigen.

auch, vielleicht kann dies helfen: http://www.coreywoodcox.com/2008/08/18/rails-namespaces-subdomains/.

edit:

gut, dann der richtige Weg, um die Strecke zu nennen, ist admin_blog_entries_path statt blog_entries_path.

+0

OK, ich habe sie gepostet. – nlaq

1

Ihre routes.rb sollten wie folgt aussehen:

map.namespace :admin do |admin| 
    admin.namespace :blog do |blog| 
    blog.resources :entries 
    blog.resources :categories 
    ... 
    end 
end 

aber ich bin nicht sicher, wie dieser ‚/ Blog /‘ behandeln Teil in Ihrer URL (ich benutze keinen Namensraum in meinen Modellen noch).Aber mit diesen Routen können Sie verwenden:

admin_blog_categories_path    => '/admin/blog/categiries' 
admin_blog_category_path(@some_category) => '/admin/blog/categories/1' 

und so weiter.

+0

Der '/ blog /' Teil kann von 'scope'/blog 'do ... end' hinzugefügt werden – Scholle

1

OK, hier meine ziemlich hacky Art, es zu tun, die ich nicht mag, aber funktioniert.

In meinem Fall habe ich die Modelle Blog :: Artikel, Blog :: Kommentar, sie sind in den Routen verschachtelt. Ein Vorbehalt, wenn Sie diesen Ansatz verwenden, ist im Blog :: CommentsController, wenn Sie den Artikel laden, können Sie params [: article_id] oder params [: blog_article_id] erwarten. Auf keinen Fall nett, aber wie ich schon sagte. Es funktioniert:/

blog.resources :articles do |article| 
    article.resources :comments 
end 

blog.resources :blog_articles, :controller => 'articles' do |blog_article| 
    blog_article.resources :blog_comments, :controller => 'comments' 
end 
Verwandte Themen