Techioz Blog

メソッドが許可されていないレール

概要

コントローラーに対して ajax ポスト呼び出しを行っています。私のAjax呼び出しは次のとおりです。

$.ajax({
  type:'POST',
  url:'/chefUI/configure/save_roles',
  data:{ app_name: appname, role_list: role_list},...});

私のルートファイルは次のとおりです。

scope "/chefUI" do
    post '/configure/save_roles', to: 'admin#update_app_roles'
end

そして、私のコントローラーには次のものがあります。

def update_app_roles
    begin
      application_name = params["app_name"]
      puts application_name
      role_name_list = params["role_list"]
      puts role_name_list
      if application_name and !role_name_list.empty?
      ...

そして、「405 Method Not allowed」という応答が返されます。何が原因でこれが起こるのかわかりません。誰かがここで私が欠けているものを理解するのを手伝ってくれませんか?私の投稿リクエストがコントローラーに届かない理由はわかりません。

ログファイル

Started GET "/chefUI/configure/app_roles?app_name=MFRH" for 127.0.0.1 at 2015-07-24 15:08:51 +0530 Processing by AdminController#app_roles as */*   Parameters: {"app_name"=>"MFRH"}   [1m[35mUser Load (1.0ms)[0m  SELECT  "users".* FROM "users" WHERE "users"."username" = $1 LIMIT 1  [["username", "an9v0s7"]]   [1m[36mApplication Load (2.0ms)[0m  [1mSELECT  "applications".* FROM "applications" WHERE (lower(app_name) = 'mfrh')  ORDER BY "applications"."id" ASC LIMIT 1[0m   [1m[35mRole Load (1.0ms)[0m  SELECT "roles".* FROM "roles" INNER JOIN "application_roles" ON "roles"."id" = "application_roles"."role_id" WHERE "application_roles"."application_id" = $1  ORDER BY roles.name ASC  [["application_id", 1]] Completed 200 OK in 217ms (Views: 0.0ms | ActiveRecord: 5.0ms)


Started POST "/chefUI/configure/save_roles" for 127.0.0.1 at 2015-07-24 15:08:57 +0530

すべての投稿リクエストに対してその応答が得られていることがわかりました。以前はすべて動作していましたが、新しいモデルで大量に作成したのに、突然どれも動作しなくなりました。

解決策

この問題は、これまで考えられていたよりも少し奥が深いです。

Rails は、ルート パスとアセット ディレクトリが同じサブディレクトリにあることを好みません。

投稿リクエストを行うと、許可されていないメソッドが表示されます。問題は、パスとアセット ディレクトリが重複できないことです。問題は、特にそのパス内の POST リクエストにあります。 Rails のどこかで、アセット ディレクトリに対するすべての非 GET リクエストが無効になっているはずだと推測しています。

scope "/chefUI" do
    post '/configure/save_roles', to: 'admin#update_app_roles'
end

config.assets.prefix="/chefUI/assets"
                                ^ You need this part so they don't overlap.

以下の非常に単純なアプリでは、メソッドが許可されていないというエラーが発生します。パス /welcome がルートとアセット プレフィックスに使用されているためです。

ファイル: config/environment/development.rb

config.assets.prefix = '/welcome'

ファイル: config/routes.rb

resources :welcomes, path: 'welcomes', only: ['index', 'create']

ファイル: app/controllers/welcomes_controller.rb

class WelcomesController < ApplicationController
  def index
    @welcome = 'hello';
  end

  def create
    @welcome = 'world';
  end
end

ファイル: app/views/welcomes/index.html.rb

<%= form_for(@welcome) do |f| %>
    <%= f.submit 'Submit' %>
<% end %>

ファイル: app/views/welcomes/create.html.rb

<h1>Welcomes#create</h1>
<p>Find me in app/views/welcomes/create.html.erb</p>