首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails如何解析POST请求参数?

rails如何解析POST请求参数?
EN

Stack Overflow用户
提问于 2015-09-25 18:19:11
回答 3查看 2.6K关注 0票数 1

我正在开发一个应用程序,在这个应用程序中,我向我的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(:名称,:饥饿,:心情)

我如何也允许:可爱的价值?

EN

回答 3

Stack Overflow用户

发布于 2015-09-26 11:11:49

你最好在HTTP - Difference between GET and POST上阅读一下。

发送请求的不是Rails,而是普通的旧HTML。

您所看到的不同之处在于您的服务器如何获取POST参数,考虑到GET参数是通过url传递的.

注意,查询字符串(名称/值对)是在GET请求的URL中发送的: 注意,查询字符串(名称/值对)是在POST请求的HTTP正文中发送的。

因此,您的问题的基本级别回答是,您需要将您的POST参数附加到请求的消息正文中。我所知道的关于如何使用JQuery ajax的最好示例是:

代码语言:javascript
复制
$.ajax({
   url: ...,
   data: {your: key, value: pairs}
});

要回答其他问题,应该使用以下结构:

代码语言:javascript
复制
#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

您可以在这里阅读有关自连接的内容:许多?

这将使你有能力创造一只猫,并将它指定为另一只猫的小猫:

代码语言:javascript
复制
#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

这将使你有以下能力:

代码语言:javascript
复制
#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 %>

这也将使您能够打电话:

代码语言:javascript
复制
@cat = Cat.find params[:id]
@cat.kittens.each do |kitten|  
   kitten.mood #-> "cute"
票数 1
EN

Stack Overflow用户

发布于 2015-09-26 12:27:02

这归结为一种叫做参数包装的东西

为了方便起见,您不必提交根(在您的情况下,将所有内容都放在用户元素中),但仍然可以使用params[:user]

默认情况下,如果请求格式有参数包装,那么CatsController将对任何匹配Cat.attribute_names的参数执行此操作。例如,您可以使用wrap_parameters方法定制控制器参数包装的方式(或者关闭控制器,控制触发它的内容类型)。

代码语言:javascript
复制
class CatsController < ActionController::Base
  wrap_parameters :cat, include: [:cute]
end

还可以在要包装的参数列表中包含可爱的内容,然后您可以这样做。

代码语言:javascript
复制
params.require(:cat).permit(:name, :hunger, :mood, :cute)
票数 1
EN

Stack Overflow用户

发布于 2016-04-08 17:22:06

@弗雷德里克·张:非常感谢你的链接。像@Curse一样,我一直在试图弄清楚为什么我会得到rails日志中打印的JSON HTTP POST参数的两个副本(即:副本)。添加

代码语言:javascript
复制
wrap_parameters format: []

在我的控制器定义的顶端给了我

代码语言:javascript
复制
{name:"",hunger:"", mood:"",cute:""}

在我的日志输出中而不是

代码语言:javascript
复制
{name:"", hunger:"", mood:"", cute:"", cat:{name:"", hunger:"", mood:""}}

因为我意识到我

代码语言:javascript
复制
wrap_parameters format: [:json]

在config/initializers/wrap_PANETIEMENTs.rb中。启用wrap_parameters可以使日志大小翻倍,如果大型JSON文档是Rails 3服务器的POSTed .

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32788352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档