Namespace, routes - No route matches [POST]

Hej mam taki o to problem. Zdefiniowałem namepsace :admin do niego przypisałem jeden kontroler :articles. Requesty typu GET są normalnie odczytywane, niestety problem pojawia się przy requestach typu POST.

routes.rb:

Rails.application.routes.draw do

For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html

namespace :core do
end

namespace :admin do
resources :articles
end
end

rake routes:

Prefix Verb URI Pattern Controller#Action
admin_articles GET /admin/articles(.:format) admin/articles#index
POST /admin/articles(.:format) admin/articles#create
new_admin_article GET /admin/articles/new(.:format) admin/articles#new
edit_admin_article GET /admin/articles/:id/edit(.:format) admin/articles#edit
admin_article GET /admin/articles/:id(.:format) admin/articles#show
PATCH /admin/articles/:id(.:format) admin/articles#update
PUT /admin/articles/:id(.:format) admin/articles#update
DELETE /admin/articles/:id(.:format) admin/articles#destroy

Masz kontroler w namespace? W sensie czy klasa kontrolera jest w formie Admin::xxxControler, ew zamiast namespace użyj scope.

tak kontroler znajduje się w: app/controllers/admin/article_controller.rb:

class Admin::ArticlesController < Core::AdminController
    def new
        @article = Article.new
    end

    def create
        @article = Article.new
    end
end

tak jak napisałem, podczas wejścia na url: http://localhost:3000/admin/articles/new, formularz się wyświetla, jednakże podczas wysyłania POST-a dostaję wyjątek:

Routing Error
No route matches [POST] "/admin/articles/new"

Bo POST powinien iść na /admin/articles, a nie na /admin/articles/new. To nie jest problem z routingiem tylko z formularzem najwyraźniej.

1 Like

Faktycznie, błąd miałem w formularzu:

= form_for :article do |f|

dodałem url przy generowaniu formularza:

= form_for :article, url: admin_articles_path do |f|

zmień :article na @article w form_for

1 Like

Po podaniu takiego parametru dostaję wyjątek:

= form_for @article do |f|
def new
    @article = Article.new
end

def create
    @article = Article.new(article_params)

	@article.save
        redirect_to admin_articles_path
end
NoMethodError in Admin::Articles#new

undefined method `articles_path' for #<#<Class:0x8eddf20>:0x8eb1efc>
Did you mean?  asset_path

edit:

Dokonałem zmiany w routes.rb:

Rails.application.routes.draw do
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
  namespace :core do
  end

  namespace :admin do
  	resources :articles
  end

  scope :admin do
  	resources :articles
  end
end

dzięki czemu wywołanie = form_for @article do |f| zaczęło ładnie działać.

nie działało bo masz namespace, wystarczy go dodać do form:

= form_for [:admin, @article] do |f|

1 Like

to rozwiązanie jest idealnie, dzięki wielkie za pomoc :wink: