Problem z najprostszym scaffoldem :(

Witam wszystkich, to mój pierwszy post na tym forum. Jak zaczynałem z RoR to wszystko mi działało. Dopiero jak zacząłem instalować Aptanę to pojawił się problem. Problem jest nawet jak normalnie wszystko w CMD robię, otóż: tworzę projekt (rails -d mysql), robię odpowiednią bazę w mysql, tworzę model i migrację, i generuję scaffold odpowiedni. Jak już to zrobię i wchodzę na odpowiedni adres (http://localhost:3000/news) to mi się ładnie pokazuje nagłówek i link do stworzenia nowego rekordu. Jednak gdy chcę stworzyć nowy rekord to moim oczom ukazuje się takie coś:

ActionController::RoutingError in News#new

Showing app/views/news/new.html.erb where line #3 raised:

news_url failed to generate from {:controller=>“news”, :action=>“show”} - you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: [“news”, :id] - are they all satisfied?

Extracted source (around line #3):

1:

New news


2:
3: <% form_for(@news) do |f| %>
4: <%= f.error_messages %>
5:
6:

RAILS_ROOT: C:/website
Application Trace | Framework Trace | Full Trace

c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/routing/route_set.rb:430:in raise_named_route_error' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/routing/route_set.rb:387:ingenerate’
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/url_rewriter.rb:205:in rewrite_path' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/url_rewriter.rb:184:inrewrite_url’
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/url_rewriter.rb:162:in rewrite' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_controller/base.rb:634:inurl_for’
c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_view/helpers/url_helper.rb:85:in send' c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.3.4/lib/action_view/helpers/url_helper.rb:85:inurl_for’
(eval):16:in news_path' C:/website/app/views/news/new.html.erb:3:in_run_erb_app47views47news47new46html46erb’
C:/website/app/controllers/news_controller.rb:29:in `new’

BŁAGAM O POMOC!!! (wcześniej to samo działało jak należy)

To przez nazwę resource z której skorzystałeś. Zrobiłeś zapewne script/generate scaffold news blabla. Przez to masz model, który się nazywa News i kontroler o takiej samej nazwie, co jest niezgodne z konwencją, bo model powinien mieć liczbę pojedynczą, a kontroler mnogą, żeby działało na domyślnych routes.

Pokaż swój plik config/routes.rb

PLIK ROUTES.RB:
ActionController::Routing::Routes.draw do |map|
map.resources :news

The priority is based upon order of creation: first created -> highest priority.

Sample of regular route:

map.connect ‘products/:id’, :controller => ‘catalog’, :action => ‘view’

Keep in mind you can assign values other than :controller and :action

Sample of named route:

map.purchase ‘products/:id/purchase’, :controller => ‘catalog’, :action => ‘purchase’

This route can be invoked with purchase_url(:id => product.id)

Sample resource route (maps HTTP verbs to controller actions automatically):

map.resources :products

Sample resource route with options:

map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get }

Sample resource route with sub-resources:

map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller

Sample resource route with more complex sub-resources

map.resources :products do |products|

products.resources :comments

products.resources :sales, :collection => { :recent => :get }

end

Sample resource route within a namespace:

map.namespace :admin do |admin|

# Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb)

admin.resources :products

end

You can have the root of your site routed with map.root – just remember to delete public/index.html.

map.root :controller => “welcome”

See how all your routes lay out with “rake routes”

Install the default routes as the lowest priority.

Note: These default routes make all actions in every controller accessible via GET requests. You should

consider removing or commenting them out if you’re using named routes and resources.

map.connect ‘:controller/:action/:id’
map.connect ‘:controller/:action/:id.:format’

end

Spróbujęz tą liczbą mnogą…

Może zamiast kombinować z new/news/newses(O_o) i routes zrób scaffold dla post, wtedy będziesz miał kontroler posts i nie będzie żadnych problemów.

OK :smiley: spróbujemy :stuck_out_tongue:

LUDZIE!! Ja wam chyba po piwie na realu postawię, Działa!! wystarczyło że model zrobiłem post, a scaffold posts :D:D:D WIEEEEEELKIE DZIĘKI!!!

Twój problem wynikał z tego, że słowo “news” jest samo w sobie już liczbą mnogą. Dlatego też do map resources powinienes wykorzystać :singular => ‘new’ i to rozwiązało by twój problem, nastomiast ścieżka do nowego newsa byłaby new_path.: )

Pozdro

Dużo konwencji w Railsach opiera się na przekształcaniu słów z liczby mnogiej na pojedynczą lub na odwrót. Chyba nienajlepszym pomysłem jest stosowanie rzeczowników niepoliczalnych - wydaje mi się, że kiedyś było to już poruszane.

Dobrze na przyszłość wiedzieć :smiley: Ale nie wiem dlaczego, na railsach 2.3.3 działało mi tak jak miałem na początku, a na 2.3.4 już nie. pewnie jakieś poprawki… Mam jeszcze jedno pytanie ale już nie do tego tematu: czy jeżeli chcę stworzyć stronę startową mojej aplikacji to mam jądawaćjako jeden z widoków jakiegoś kontrolera w app\views czy w public\ jako index.html?? i czy w tym index.html można dawać jakieś <% %>, bo to jednak tylko html, a nie rhtml.erb.

w routes:

 map.root '/', :controller => '', :action => ''

Ok, dzięki wielkie, temat uważam za wyczerpany :smiley: Dziekuję wszystkim.