我正在开发一个应用程序,在这个应用程序中,我向我的rails服务器发送post请求,并以JSON格式存储参数。假设我的应用程序将请求路由到我的cats_controller上的create函数。猫模型有三个字段:名称、饥饿、情绪。现在每只猫has_many小猫。我的猫模型有两个字段:cat_id (指哪只猫拥有它,因为我的小猫belongs_to是一只猫)和:可爱。现在,每当我在我的应用程序上创建一只猫时,我都想用一个调用来完成它,所以我用POST请求从我的应用程序中调用/cats.json。参数以JSON格式存储,它们包括以下字段(名称:“”、饥饿:“”、语气:“”、可爱:“”}。现在,控制器使用这些参数创建一个新的猫,然后使用cat.kittens.build()创建分配给这个猫的新猫。然后,小猫只需要使用我发送的最后一个参数"mood:“就可以正确地创建。
现在的问题是,当我从这个控制器打印params变量时,我得到了以下散列:{name:"",饥饿:“”,心情:“”,可爱:“”,cat:{name:"",饥饿:“”,语气:“}}。这一切为什么要发生?Rails如何解析POST请求参数并将我从
{名称:“”,饥饿:“”,心情:“”,可爱:}{名称:“”,饥饿:“”,心情:“”,可爱:“”,:{name:“,饥饿:”,心情:“}}
这个"cat“散列是如何生成的,什么时候,以及它遵循什么规则?
那么我的后续问题将是,因为rails 4强迫您在使用参数之前使用白名单参数。我正在做:
Params.require(:cat).permit(:名称,:饥饿,:心情)
我如何也允许:可爱的价值?
发布于 2015-09-26 11:11:49
你最好在HTTP - Difference between GET and POST上阅读一下。
发送请求的不是Rails,而是普通的旧HTML。
您所看到的不同之处在于您的服务器如何获取POST参数,考虑到GET参数是通过url传递的.
注意,查询字符串(名称/值对)是在GET请求的URL中发送的: 注意,查询字符串(名称/值对)是在POST请求的HTTP正文中发送的。
因此,您的问题的基本级别回答是,您需要将您的POST参数附加到请求的消息正文中。我所知道的关于如何使用JQuery ajax的最好示例是:
$.ajax({
url: ...,
data: {your: key, value: pairs}
});要回答其他问题,应该使用以下结构:
#app/models/cat.rb
class Cat < ActiveRecord::Base
#columns id | name | mood | created_at | updated_at
has_and_belongs_to_many :kittens
class_name: "Cat",
join_table: :kittens,
foreign_key: :cat_id,
association_foreign_key: :kitten_id
alias_attribute :born, :created_at #-> allows you to call @cat.born
end
#kittens table
#columns cat_id | kitten_id您可以在这里阅读有关自连接的内容:许多?
这将使你有能力创造一只猫,并将它指定为另一只猫的小猫:
#app/controllers/cats_controller.rb
class CatsController < ApplicationController
def new
@cat = Cat.new
end
def create
@cat = Cat.new cat_params
@cat.save
end
private
def cat_params
params.require(:cat).permit(:name, :mood, :kittens)
end
end这将使你有以下能力:
#app/views/cats/new.html.erb
<%= form_for @cat do |f| %>
<%= f.text_field :name %>
<%= f.text_field :mood %>
<%= f.collection_select :kittens, Cat.all, :id, :name %>
<%= f.submit %>
<% end %>这也将使您能够打电话:
@cat = Cat.find params[:id]
@cat.kittens.each do |kitten|
kitten.mood #-> "cute"发布于 2015-09-26 12:27:02
这归结为一种叫做参数包装的东西
为了方便起见,您不必提交根(在您的情况下,将所有内容都放在用户元素中),但仍然可以使用params[:user]。
默认情况下,如果请求格式有参数包装,那么CatsController将对任何匹配Cat.attribute_names的参数执行此操作。例如,您可以使用wrap_parameters方法定制控制器参数包装的方式(或者关闭控制器,控制触发它的内容类型)。
class CatsController < ActionController::Base
wrap_parameters :cat, include: [:cute]
end还可以在要包装的参数列表中包含可爱的内容,然后您可以这样做。
params.require(:cat).permit(:name, :hunger, :mood, :cute)发布于 2016-04-08 17:22:06
@弗雷德里克·张:非常感谢你的链接。像@Curse一样,我一直在试图弄清楚为什么我会得到rails日志中打印的JSON HTTP POST参数的两个副本(即:副本)。添加
wrap_parameters format: []在我的控制器定义的顶端给了我
{name:"",hunger:"", mood:"",cute:""}在我的日志输出中而不是
{name:"", hunger:"", mood:"", cute:"", cat:{name:"", hunger:"", mood:""}}因为我意识到我
wrap_parameters format: [:json]在config/initializers/wrap_PANETIEMENTs.rb中。启用wrap_parameters可以使日志大小翻倍,如果大型JSON文档是Rails 3服务器的POSTed .
https://stackoverflow.com/questions/32788352
复制相似问题