2011-08-21 54 views
4

一個Backbone.js的模型時,我有一個項目對象Backbone.js的收集和模型:錯誤節約使用Rails

window.Project = Backbone.Model.extend(); 

window.Projects = Backbone.Collection.extend({ 
    model: Project, 
    url: '/projects' 
}); 

我已經建立了軌道控制器向Backbone.js的集合迴應:

class ProjectsController < ApplicationController 

    def index 
     render :json => Project.all 
    end 

    def create 
     project = Project.create! params 
     render :json => project 
    end 

end 

索引工作正常,我在我的web應用程序中獲得項目列表。問題是如果我嘗試在Projects集合上創建一個模型,我會從服務器獲得一個500錯誤。

在服務器上的錯誤信息如下:

Started POST "/projects" for 127.0.0.1 at 2011-08-21 08:27:56 +0100 
    Processing by ProjectsController#create as JSON 
    Parameters: {"title"=>"another test"} 
Completed 500 Internal Server Error in 16ms 

ActiveRecord::UnknownAttributeError (unknown attribute: action): 
    app/controllers/projects_controller.rb:8:in `create' 

我不知道什麼unknown attribute: action所指的。

有關信息,我已將projects_controller設置爲resources :projects。我也設置了軌道到ActiveRecord::Base.include_root_in_json = false

+0

謝謝,所以Rails總是添加行動和控制器參數。這將解釋錯誤。 – moose56

回答

5

是的,Rails總是將actioncontroller添加到params。參數來自ActionDispatch :: HTTP ::參數:

def parameters 
    @env["action_dispatch.request.parameters"] ||= begin 
    params = request_parameters.merge(query_parameters) 
    params.merge!(path_parameters) 
    encode_params(params).with_indifferent_access 
    end 
end 

而且path_parameters

返回與用於形成請求的路徑參數的哈希值。返回哈希鍵是字符串:

{'action' => 'my_action', 'controller' => 'my_controller'} 

所以,你不應該做project = Project.create! params。你可以去update_attributes路線:

project = Project.new 
project.update_attributes params[:model_name] 

但這是假設你有你的params子哈希需要什麼,也不會打電話給你驗證。 Backbone不會默認命名空間屬性,但您可以覆蓋Backbone.sync並自己動手。不過,你可能希望你的驗證,所以update_attributes通常應該避免。

最好的辦法就是把你想要的params屬性拉出來。這是連Backbone recommended practise

*(在實際的代碼,千萬不要用盲目的update_attributes,始終列入白名單,你允許更改的屬性)*

+0

非常感謝您的幫助。 – moose56

+0

是的,謝謝你的解釋。這當然似乎使使用Backbone.js開始感覺非常笨重,不得不拔出我期望的參數成爲維護問題。 – shakerlxxv

+0

@shakerlxxv:如果你不希望你的控制器控制自己的接口,你可以很容易地過濾'params';你可以通過'dup'和'delete'來擺脫你不想要的東西或者「切片」來得到你所期望的。當然,在這種情況下,您的模型驗證必須非常詳細和偏執。 –

0

您可以啓用參數包裝。在初始化目錄中添加一個文件:

ActiveSupport.on_load(:action_controller) do 
    wrap_parameters format: [:json] 
end 

,併爲JSON請求,你post數據現將型號名稱包裝。