我正在对控制器进行 ajax post 调用。我的 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 不喜欢路由路径和资源目录位于同一子目录中。
发出帖子请求时,您将获得
method not allowed
。问题是路径和资源目录不能重叠。问题具体在于该路径中的 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.
在下面这个非常简单的应用程序中,您将收到一个
method not allowed
错误。因为路径 /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>
我删除了 application.rb 中的以下行,问题得到了解决。
config.assets.prefix="/chefUI"
我不明白 config.assets.prefix 与 POST 请求有什么关系,但这解决了我的问题。
很想了解原因。
我遇到了同样的错误,但由于
POST
生成的代码完成了 rails g scaffold
请求。这毫无意义。这是一款只有一个模型的明亮新应用程序!所有代码均由rails g
生成。
但是,就我而言,我将模型命名为
asset
并且该路径与静态资源的 assets/
路径冲突。
事实证明我的解决方案是做@anirudh答案的正确逆操作:在我的
config/application.rb
中包含以下内容:
config.assets.prefix="/my-app-assets"
服务器重新启动,然后问题解决:我成功在数据库中创建了我的资产记录!