2015-05-27 23 views
7

Ben ettik Rails 3.2 yükseltme çalışılıyor varolan kod temeli 4.0Raylar 4 Yöntem Raylar yükseltme sonrasında İzin Değil 3

Rails lazım Ben kontrolör bir 'create' yöntemi ve I assets_controller denilen benim yolları dosyasında bir bir girdi vardır: '/ varlıklar' bir tarayıcıya gelen, benim hemen ben bir post isteği göndermek eğer, ön uçta jQuery kullanarak

resources :assets 

405 (Yönteme İzin verilmiyor):

$.ajax({method: 'POST', data: asset, url: '/assets' }); 

Bu Rails 3'te gayet iyi çalıştı ve sorunun ne olduğunu anlayamıyorum.

Güncellemeler:

İşte

benim denetleyicisi basitleştirilmiş sürümü:

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 

İşte 'tırmık Yollar'

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 

İşte benim geliştirme günlüğünden çıkışı:

Started POST "/assets" for 127.0.0.1 at 2015-05-27 09:39:42 -0400 

POST DATA (evet bu tüm günlük vardır): { "ASSET_TYPE": "Belge", "title": "DNS", "heading_id": 9999, "Telif hakkı": false, "url": "https://confidental.url", "pubtitle": "DNS", "yazar": ""}

Başka Düzenleme: benim tüm yolları dışarı yorumladı tanı amaçlı dosya, bunların sonuçlarıdır bazı manuel testler yapmak:

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) 

, varlıklar 4 türünde ayrılmış bir son nokta mıdır?

+0

Bu sadece bir önsezi olabilir ama 4 kontrolleri raylar siteler arası talep sahteciliği için. Bu, csrf belirteci olmadan bir rotaya gönderemeyeceğiniz anlamına gelir. Sorun hakkında daha fazla ayrıntı vermelisiniz. Denetleyici kodu ve "varlık" verilerinin denetleyiciye nasıl gönderildiğini nasıl göründüğü gibi. Raylar 4 güvenlik kılavuzu: http://guides.rubyonrails.org/security.html – JensDebergh

+0

Denetleyicime 'skip_before_filter: verify_authenticity_token' ekledim ve denetleyicime herhangi bir csrf belirteci doğrulamasını atlamalıyım. yardım et. – denodster

+0

@JensD İstenilen bilgileri ekledim – denodster

cevap

5

Bu, yalnızca assets sözcüküyle ilgili değildir. Bir rota yolu ve varlık dizini aynı alt dizinde olduğunda raylar hoşlanmaz.

Bir posta isteği yaparken, method not allowed alırsınız. Sorun, yollarla ve varlık dizini ile çakışma olamaz. Sorun, özellikle bu yoldaki POST istekleridir. Raylarda bir yer varsayarak, varlıklar dizini için GET olmayan tüm istekleri devre dışı bırakmış olmalılar.

Aşağıda bu çok basit uygulamasında

, bir method not allowed hatası alırsınız. Yol için /welcomes yolundan ve varlık öneki için kullanıldığı için.

Dosya: config/environment/development.rb

config.assets.prefix = '/welcomes' 

Dosya: config/routes.rb

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

Dosya: app/controllers/welcomes_controller.rb

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

    def create 
    @welcome = 'world'; 
    end 
end 

Dosya: app/views/welcomes/index.html.rb

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

Dosya: app/views/welcomes/create.html.rb

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

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

+0

Öğeler adlı bir modelim var ve üretimde öneki kullanıyorum. Gelişimdeki öneki de kullanmam gerekti. –

8

Sorun, 'varlıklar' adıyla ortaya çıkıyor. Bunu doğrulamak için herhangi bir belge bulamıyorum, ancak varlık modelini ve denetleyiciyi başka bir şeye yeniden adlandırmak sorunu çözdü.

+1

Bu sonuçta aynı sonuçlar. Rotayı yalnızca bir kapsamda sarmalamanın tembel düzeltmesini seçtim. – fatty

+1

, özel olarak 'varlık' olarak adlandırılan modelinizdi? – denodster

+4

Öyleydi, ancak sorun rota adından geldiği gibi görünüyordu. Bunu kapsamı olarak tanımlamak: bir şey kaynakları yapmak: varlıklar sonu, bunun üstesinden gelmek için düşünebildiğim en basit şeydi ve Denetçi veya Model adlarını ve Klasör yapısını görmez. – fatty

1

sorunun asset kontrolör yolları raylar varsayılan /assets yolu ile çelişen olmasıdır.

basit çözüm aşağıdaki gibi okumak için config/routes.rb dosya hattını değiştirmek için (veya assets değil sizin seçtiğiniz herhangi bir başka yolu):

resources :assets, path: 'site_assets'