Rails 4 从 Rails 3 升级后不允许使用该方法
Rails 4 Method Not Allowed after Upgrading from Rails 3
我有一个现有的代码库,我正在尝试将其从 Rails 3.2 升级到 Rails 4.0
我有一个名为 assets_controller 的控制器,它使用 'create' 方法,我的路由文件中有一个条目:
resources :assets
在前端将 jQuery 用于 ajax,如果我从浏览器向“/assets”发送 post 请求,我会得到 405(方法不允许):
$.ajax({method: 'POST', data: asset, url: '/assets' });
这在 Rails 3 中工作得很好,我似乎无法弄清楚问题是什么。
更新:
这是我的控制器的简化版本:
class AssetsController < ApplicationController
skip_before_filter :verify_authenticity_token
def create
# params[:assets] is passed if a mass addition of assets (i.e. book) occurs
assets = []
if params[:assets]
assets = params[:assets]
else
assets.push params
end
last_asset_id = 0
assets.each do |asset_data|
asset = Object.const_get(asset_data[:asset_type]).new(asset_data)
if !asset.save
json_false_errors(asset.errors.full_messages)
return
else
last_asset_id = asset.id
end
end
end
end
这是 'rake routes'
的输出
assets GET /assets(.:format) assets#index
POST /assets(.:format) assets#create
new_asset GET /assets/new(.:format) assets#new
edit_asset GET /assets/:id/edit(.:format) assets#edit
asset GET /assets/:id(.:format) assets#show
PATCH /assets/:id(.:format) assets#update
PUT /assets/:id(.:format) assets#update
DELETE /assets/:id(.:format) assets#destroy
这是我的开发日志:
Started POST "/assets" for 127.0.0.1 at 2015-05-27 09:39:42 -0400
(是的,这就是所有日志)
POST 数据:
{
"asset_type":"Document",
"title":"DNS",
"heading_id":9999,
"copyrighted":错误,
"url":"https://confidental.url",
"pubtitle":"DNS",
"author":""}
另一个编辑:
我出于诊断目的注释掉了我的整个路由文件,这些是进行一些手动测试的结果:
POST http://localhost:8000/assets 405 (Method Not Allowed)
POST http://localhost:8000/asset 404 (Not Found)
POST http://localhost:8000/ass 404 (Not Found)
资产是 rails 4 中的某种保留端点吗?
事实证明问题出在名称 'assets' 我找不到任何文档来证实这一点,但是将资产模型和控制器重命名为其他名称解决了问题。
这不仅仅是关于 assets
这个词。 Rails 不喜欢路由路径和资产目录在同一个子目录中。
发出 post 请求时,您将获得 method not allowed
。问题是路径和资产目录不能重叠。问题特别在于该路径中的 POST
请求。我假设在 rails 的某处,他们必须禁用对资产目录的所有非 GET 请求。
在下面这个非常简单的应用程序中,您会遇到 method not allowed
错误。因为路径 /welcomes
被用于路由和资产前缀。
文件:config/environment/development.rb
config.assets.prefix = '/welcomes'
文件: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>
问题是您的 asset
控制器路由与 rails 默认 /assets
路径冲突。
最简单的解决方案是将您的 config/routes.rb
文件行修改为如下内容(或您选择的任何其他非 assets
的路径):
resources :assets, path: 'site_assets'
我有一个现有的代码库,我正在尝试将其从 Rails 3.2 升级到 Rails 4.0
我有一个名为 assets_controller 的控制器,它使用 'create' 方法,我的路由文件中有一个条目:
resources :assets
在前端将 jQuery 用于 ajax,如果我从浏览器向“/assets”发送 post 请求,我会得到 405(方法不允许):
$.ajax({method: 'POST', data: asset, url: '/assets' });
这在 Rails 3 中工作得很好,我似乎无法弄清楚问题是什么。
更新:
这是我的控制器的简化版本:
class AssetsController < ApplicationController
skip_before_filter :verify_authenticity_token
def create
# params[:assets] is passed if a mass addition of assets (i.e. book) occurs
assets = []
if params[:assets]
assets = params[:assets]
else
assets.push params
end
last_asset_id = 0
assets.each do |asset_data|
asset = Object.const_get(asset_data[:asset_type]).new(asset_data)
if !asset.save
json_false_errors(asset.errors.full_messages)
return
else
last_asset_id = asset.id
end
end
end
end
这是 'rake routes'
的输出 assets GET /assets(.:format) assets#index
POST /assets(.:format) assets#create
new_asset GET /assets/new(.:format) assets#new
edit_asset GET /assets/:id/edit(.:format) assets#edit
asset GET /assets/:id(.:format) assets#show
PATCH /assets/:id(.:format) assets#update
PUT /assets/:id(.:format) assets#update
DELETE /assets/:id(.:format) assets#destroy
这是我的开发日志:
Started POST "/assets" for 127.0.0.1 at 2015-05-27 09:39:42 -0400
(是的,这就是所有日志)
POST 数据: { "asset_type":"Document", "title":"DNS", "heading_id":9999, "copyrighted":错误, "url":"https://confidental.url", "pubtitle":"DNS", "author":""}
另一个编辑: 我出于诊断目的注释掉了我的整个路由文件,这些是进行一些手动测试的结果:
POST http://localhost:8000/assets 405 (Method Not Allowed)
POST http://localhost:8000/asset 404 (Not Found)
POST http://localhost:8000/ass 404 (Not Found)
资产是 rails 4 中的某种保留端点吗?
事实证明问题出在名称 'assets' 我找不到任何文档来证实这一点,但是将资产模型和控制器重命名为其他名称解决了问题。
这不仅仅是关于 assets
这个词。 Rails 不喜欢路由路径和资产目录在同一个子目录中。
发出 post 请求时,您将获得 method not allowed
。问题是路径和资产目录不能重叠。问题特别在于该路径中的 POST
请求。我假设在 rails 的某处,他们必须禁用对资产目录的所有非 GET 请求。
在下面这个非常简单的应用程序中,您会遇到 method not allowed
错误。因为路径 /welcomes
被用于路由和资产前缀。
文件:config/environment/development.rb
config.assets.prefix = '/welcomes'
文件: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>
问题是您的 asset
控制器路由与 rails 默认 /assets
路径冲突。
最简单的解决方案是将您的 config/routes.rb
文件行修改为如下内容(或您选择的任何其他非 assets
的路径):
resources :assets, path: 'site_assets'