Leahcim
Leahcim

Reputation: 42049

Rails: :method => :delete looking for 'show' action

I have installed the Enki (blogging) gem https://github.com/xaviershay/enki together with the Forem (forums) gem https://github.com/radar/forem that uses Devise for its registration. Everything seems to be working except when I click a link

<li><%= link_to t('delete', :scope => 'forem.topic'), topic_post_path(@topic, post), :method => :delete, :confirm => t("are_you_sure") %></li>

to delete a post (or anything else) inside the forums, I'm getting this error message

Unknown action

The action 'show' could not be found for Forem::PostsController

I note that the Forem link has :method => :delete so this shouldn't be happening. Also, when I use Forem without Enki, I don't get this problem. I assume that for some reason the rails app is not seeing the :method => :delete so the method is being registered as a "show" instead of a destroy action, but I don't know why. In the logfile it says

* REQUEST_METHOD : GET –

I'm guessing there's some sort of conflict in the routing that's disabling the :method => :delete but I can't figure it out.

config/routes.rb

Enki::Application.routes.draw do
  mount Forem::Engine, :at => "/forums"
  devise_for :users

  namespace 'admin' do
    resource :session

    resources :posts, :pages do
      post 'preview', :on => :collection
    end
    resources :comments
    resources :undo_items do
      post 'undo', :on => :member
    end

    match 'health(/:action)' => 'health', :action => 'index', :as => :health

    root :to => 'dashboard#show'
  end

  resources :archives, :only => [:index]
  resources :pages, :only => [:show]

  constraints :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ do
    get ':year/:month/:day/:slug/comments'  => 'comments#index'
    post ':year/:month/:day/:slug/comments' => 'comments#create'
    get ':year/:month/:day/:slug/comments/new' => 'comments#new'
    get ':year/:month/:day/:slug' => 'posts#show'
  end

  scope :to => 'posts#index' do
    get 'posts.:format', :as => :formatted_posts
    get '(:tag)', :as => :posts
  end

  root :to => 'posts#index'
end

rake routes

forem        /forums                                         {:to=>Forem::Engine}
        new_user_session GET    /users/sign_in(.:format)                        {:action=>"new", :controller=>"devise/sessions"}
            user_session POST   /users/sign_in(.:format)                        {:action=>"create", :controller=>"devise/sessions"}
    destroy_user_session DELETE /users/sign_out(.:format)                       {:action=>"destroy", :controller=>"devise/sessions"}
           user_password POST   /users/password(.:format)                       {:action=>"create", :controller=>"devise/passwords"}
       new_user_password GET    /users/password/new(.:format)                   {:action=>"new", :controller=>"devise/passwords"}
      edit_user_password GET    /users/password/edit(.:format)                  {:action=>"edit", :controller=>"devise/passwords"}
                         PUT    /users/password(.:format)                       {:action=>"update", :controller=>"devise/passwords"}
cancel_user_registration GET    /users/cancel(.:format)                         {:action=>"cancel", :controller=>"devise/registrations"}
       user_registration POST   /users(.:format)                                {:action=>"create", :controller=>"devise/registrations"}
   new_user_registration GET    /users/sign_up(.:format)                        {:action=>"new", :controller=>"devise/registrations"}
  edit_user_registration GET    /users/edit(.:format)                           {:action=>"edit", :controller=>"devise/registrations"}
                         PUT    /users(.:format)                                {:action=>"update", :controller=>"devise/registrations"}
                         DELETE /users(.:format)                                {:action=>"destroy", :controller=>"devise/registrations"}
           admin_session POST   /admin/session(.:format)                        {:action=>"create", :controller=>"admin/sessions"}
       new_admin_session GET    /admin/session/new(.:format)                    {:action=>"new", :controller=>"admin/sessions"}
      edit_admin_session GET    /admin/session/edit(.:format)                   {:action=>"edit", :controller=>"admin/sessions"}
                         GET    /admin/session(.:format)                        {:action=>"show", :controller=>"admin/sessions"}
                         PUT    /admin/session(.:format)                        {:action=>"update", :controller=>"admin/sessions"}
                         DELETE /admin/session(.:format)                        {:action=>"destroy", :controller=>"admin/sessions"}
     preview_admin_posts POST   /admin/posts/preview(.:format)                  {:action=>"preview", :controller=>"admin/posts"}
             admin_posts GET    /admin/posts(.:format)                          {:action=>"index", :controller=>"admin/posts"}
                         POST   /admin/posts(.:format)                          {:action=>"create", :controller=>"admin/posts"}
          new_admin_post GET    /admin/posts/new(.:format)                      {:action=>"new", :controller=>"admin/posts"}
         edit_admin_post GET    /admin/posts/:id/edit(.:format)                 {:action=>"edit", :controller=>"admin/posts"}
              admin_post GET    /admin/posts/:id(.:format)                      {:action=>"show", :controller=>"admin/posts"}
                         PUT    /admin/posts/:id(.:format)                      {:action=>"update", :controller=>"admin/posts"}
                         DELETE /admin/posts/:id(.:format)                      {:action=>"destroy", :controller=>"admin/posts"}
     preview_admin_pages POST   /admin/pages/preview(.:format)                  {:action=>"preview", :controller=>"admin/pages"}
             admin_pages GET    /admin/pages(.:format)                          {:action=>"index", :controller=>"admin/pages"}
                         POST   /admin/pages(.:format)                          {:action=>"create", :controller=>"admin/pages"}
          new_admin_page GET    /admin/pages/new(.:format)                      {:action=>"new", :controller=>"admin/pages"}
         edit_admin_page GET    /admin/pages/:id/edit(.:format)                 {:action=>"edit", :controller=>"admin/pages"}
              admin_page GET    /admin/pages/:id(.:format)                      {:action=>"show", :controller=>"admin/pages"}
                         PUT    /admin/pages/:id(.:format)                      {:action=>"update", :controller=>"admin/pages"}
                         DELETE /admin/pages/:id(.:format)                      {:action=>"destroy", :controller=>"admin/pages"}
          admin_comments GET    /admin/comments(.:format)                       {:action=>"index", :controller=>"admin/comments"}
                         POST   /admin/comments(.:format)                       {:action=>"create", :controller=>"admin/comments"}
       new_admin_comment GET    /admin/comments/new(.:format)                   {:action=>"new", :controller=>"admin/comments"}
      edit_admin_comment GET    /admin/comments/:id/edit(.:format)              {:action=>"edit", :controller=>"admin/comments"}
           admin_comment GET    /admin/comments/:id(.:format)                   {:action=>"show", :controller=>"admin/comments"}
                         PUT    /admin/comments/:id(.:format)                   {:action=>"update", :controller=>"admin/comments"}
                         DELETE /admin/comments/:id(.:format)                   {:action=>"destroy", :controller=>"admin/comments"}
    undo_admin_undo_item POST   /admin/undo_items/:id/undo(.:format)            {:action=>"undo", :controller=>"admin/undo_items"}
        admin_undo_items GET    /admin/undo_items(.:format)                     {:action=>"index", :controller=>"admin/undo_items"}
                         POST   /admin/undo_items(.:format)                     {:action=>"create", :controller=>"admin/undo_items"}
     new_admin_undo_item GET    /admin/undo_items/new(.:format)                 {:action=>"new", :controller=>"admin/undo_items"}
    edit_admin_undo_item GET    /admin/undo_items/:id/edit(.:format)            {:action=>"edit", :controller=>"admin/undo_items"}
         admin_undo_item GET    /admin/undo_items/:id(.:format)                 {:action=>"show", :controller=>"admin/undo_items"}
                         PUT    /admin/undo_items/:id(.:format)                 {:action=>"update", :controller=>"admin/undo_items"}
                         DELETE /admin/undo_items/:id(.:format)                 {:action=>"destroy", :controller=>"admin/undo_items"}
            admin_health        /admin/health(/:action)(.:format)               {:action=>"index", :controller=>"admin/health"}
              admin_root        /admin(.:format)                                {:controller=>"admin/dashboard", :action=>"show"}
                archives GET    /archives(.:format)                             {:action=>"index", :controller=>"archives"}
                    page GET    /pages/:id(.:format)                            {:action=>"show", :controller=>"pages"}
                         GET    /:year/:month/:day/:slug/comments(.:format)     {:year=>/\d{4}/, :month=>/\d{2}/, :day=>/\d{2}/, :controller=>"comments", :action=>"index"}
                         POST   /:year/:month/:day/:slug/comments(.:format)     {:year=>/\d{4}/, :month=>/\d{2}/, :day=>/\d{2}/, :controller=>"comments", :action=>"create"}
                         GET    /:year/:month/:day/:slug/comments/new(.:format) {:year=>/\d{4}/, :month=>/\d{2}/, :day=>/\d{2}/, :controller=>"comments", :action=>"new"}
                         GET    /:year/:month/:day/:slug(.:format)              {:year=>/\d{4}/, :month=>/\d{2}/, :day=>/\d{2}/, :controller=>"posts", :action=>"show"}
         formatted_posts GET    /posts.:format                                  {:controller=>"posts", :action=>"index"}
                   posts GET    /(:tag)(.:format)                               {:controller=>"posts", :action=>"index"}
                    root        /                                               {:controller=>"posts", :action=>"index"}

Upvotes: 3

Views: 4460

Answers (3)

Taimoor Changaiz
Taimoor Changaiz

Reputation: 10684

It is because rails jquery_ujs file not getting loaded in your javascript.

Do this in your layout file, normaly named as application.html.erb

<%= javascript_include_tag "application" %>

this will include application.js file and also include your jquery_ujs file

You should check app/assets/application.js file wether this line exists there

//= require jquery_ujs

If not add it by yourself.

It will cure :)

Hint:

One of these could be the cause of problem:

1- It may cause when you are not using application.js

2- You are using different file to include libraries and forget to inlucde jquery_ujs there

Upvotes: 1

Simpleton
Simpleton

Reputation: 6415

Make sure your JavaScript is being included in your layout file:

<%= javascript_include_tag :defaults %> #Rails 3.0.x
<%= javascript_include_tag :application %> #Rails 3.1+
<%= csrf_meta_tag %>

For delete, you should really use button_to instead. Link_to should not be used for HTTP POST requests.

Upvotes: 5

Matteo Alessani
Matteo Alessani

Reputation: 10422

You need to include the jQuery for Rails gem in your Gemfile

gem 'jquery-rails'

Then you have to run bundle install and restart the server. This is because even if you have included in your layout.html.erb the jQuery framework you need the adapter for jQuery to use the unobstrusive scripting.

Upvotes: 1

Related Questions