我正在尝试通过JSON请求创建ActiveRecord对象。但是,控制器无法设置新创建的对象中的参数中传递的变量。例如,person对象有两个字段:firstname和lastname。

JSON.org库的JSON.stringify函数生成的JSON生成:

{"firstname" : "Joe" , "lastname" : "Bloggs"}

然而,控制器期望JSON采用以下形式:

{ "Person" : {"firstname" : "Joe" , "lastname" : "Bloggs"} }

我知道在正常的事件过程中(对于HTTP请求) 请求的参数嵌套在模型的类名下 被创造。

控制器中的创建操作是:

def create
    @person = Person.new(params[:person])

    respond_to do |format|
      if @person.save
        flash[:notice] = 'Person was successfully created.'
        format.html { redirect_to(@person) }
        format.xml  { render :xml => @person, :status => :created, :location => @person }
        format.json  { render :json => @person, :status => :created, :location => @person }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @person.errors, :status => :unprocessable_entity }
        format.json  { render :json => @person.errors, :status => :unprocessable_entity }
      end
    end
  end

控制器处理JSON的最佳方法是什么 请求生成?或者,您如何生成“正确”的信息。 来自Javascript对象的JSON传递给您的控制器?

TIA, 亚当

有帮助吗?

解决方案

如果你只是传递所有人参数的哈希值(而不是带有“person”的嵌套哈希值作为键)那么你应该只能做 @person = Person.new( PARAMS)

其他提示

对于ActiveRecord 3.0.7,您只需添加

即可
self.include_root_in_json = false

到您的模型(person.rb)摆脱root({" Person":")部分。

  

或者, Person.new(params.reject {| k,v | k!=" firstname" || k!=" lastname"})可以在您的Ruby中执行。

     

...

     

Person.new({:firstname => params [:firstname],:lastname => params [:lastname]}) - 这实际上有效

这是一个更具前瞻性的解决方案:

Person.new(params.reject{|k,v| not Person.column_names.include?(k) })

允许使用平面JSON输入的一个想法,例如{" firstname":" Joe"," lastname":" Bloggs"}以及使用HTML表单获得的嵌套类型将是:

@person = Person.new(params[:person] || params)

respond_to do |format|
  ..
end
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top