2015-05-27 92 views
7

我有一個現有的代碼庫,我試圖從Rails的3.2升級到Rails 4.0軌道4的方法從Rails的升級後,不允許3

我控制器稱爲assets_controller以「創造」的方法和我在我的路線文件中的一個條目:

resources :assets 

在前端使用jQuery,如果我發送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 

繼承人從 '耙路線'

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」: 「文檔」, 「稱號」: 「DNS」, 「heading_id」:9999, 「版權保護」:假的, 「URL」: 「https://confidental.url」, 「pubtitle」: 「DNS」, 「作家」: 「」}

另一個編輯: 我評論了我的整個路線文件用於診斷目的,這些都是結果做一些手工測試:

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) 

是資產某些保留端點在軌道4?

+0

這可能只是一個預感,但軌道4個檢查用於跨站點請求僞造。 這意味着您不能發佈到沒有csrf標記的路線。 你應該提供一些關於這個問題的更多細節。像控制器代碼一樣,「資產」數據看起來像是發佈給控制器。 Rails 4安全指南: http://guides.rubyonrails.org/security.html – JensDebergh

+0

我向我的控制器添加了'skip_before_filter:verify_authenticity_token',我認爲應該跳過任何csrf標記驗證,但似乎沒有幫幫我。 – denodster

+0

@JensD我已經添加了請求的信息 – denodster

回答

5

這不只是關於單詞assets。 Rails不喜歡何時路徑路徑和資產目錄位於相同的子目錄中。

在提出申請時,您將獲得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> 
+0

檢出... http://guides.rubyonrails.org/asset_pipeline.html#precompiling-assets – denodster

+0

我有一個名爲資產的模型,我在生產中使用前綴。事實證明,我也需要在開發中使用前綴。 –

8

事實證明問題出在名稱'資產'我找不到任何文件來證實這一點,但重命名資產模型和控制器到別的東西解決了問題。

+1

這一結果相同。我選擇了將路由包裹在範圍中的懶惰修復。 – fatty

+1

是你的模型,專門稱爲'資產'? – denodster

+4

這是,但問題看起來像它來自路線名稱本身。將其定義爲「範圍:某物執行資源:資產結束」是我想到的最簡單的事情,可以解決此問題,而不會影響控制器或模型名稱和視圖文件夾結構。 – fatty

1

的問題是,你的asset控制器路由與軌道默認/assets路徑衝突。

最簡單的辦法是修改你的config/routes.rb文件行改爲如下(或者說是不assets您選擇的任何其他路徑):

resources :assets, path: 'site_assets'

相關問題