使用Rails保存Backbone.js模型时出错

时间:2011-08-21 07:54:10

标签: ruby-on-rails-3 backbone.js

我有一个项目对象的Backbone.js集合和模型:

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

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

我已经设置了一个rails控制器来响应Backbone.js集合:

class ProjectsController < ApplicationController

    def index
        render :json => Project.all
    end

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

end

索引工作正常,我在我的网络应用程序中获得了一个项目列表。问题是,如果我尝试在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

2 个答案:

答案 0 :(得分:5)

是的,Rails总是将actioncontroller添加到params。参数来自ActionDispatch :: Http :: Parameters:

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,并始终将您允许更改的属性列入白名单。)*

答案 1 :(得分:0)

您可以启用参数包装。使用以下命令在初始化程序目录中添加文件:

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

并且,对于json请求,您发布的params现在将包含模型名称。