在Ruby on Rails中识别GET和POST参数

时间:2008-09-30 11:02:32

标签: ruby-on-rails

在Ruby on Rails中从控制器中识别和分离GET和POST参数的最简单方法是什么,这相当于PHP中的$ _GET和$ _POST变量?

11 个答案:

答案 0 :(得分:53)

您可以使用request.get?request.post?方法来区分HTTP获取和帖子。

答案 1 :(得分:27)

我不知道Rails中有任何方便的方法,但你可以直接访问查询字符串来解析那里设置的参数。如下所示:

request.query_string.split(/&/).inject({}) do |hash, setting|
  key, val = setting.split(/=/)
  hash[key.to_sym] = val
  hash
end

答案 2 :(得分:16)

您可以使用以下方式执行此操作:

request.POST

request.GET

答案 3 :(得分:14)

请求对象上有三个非常轻微记录的哈希访问器:

  • request.query_parameters - 作为查询字符串的一部分发送,即在?
  • 之后发送
  • request.path_parameters - 通过路由从URL解码,即controller,action,id
  • request.request_parameters - 所有参数,包括上面以及作为POST正文的一部分发送的任何参数

您可以根据需要使用Hash#reject来获取仅限POST的参数。

来源:http://guides.rubyonrails.org/v2.3.8/action_controller_overview.html第9.1.1节

我查看了一个旧的Rails 1.2.6应用程序,这些访问器也存在。

答案 4 :(得分:6)

如果要检查请求的类型以防止在使用错误的方法时执行任何操作,请注意您也可以在routes.rb文件中指定它:

map.connect '/posts/:post_id', :controller => 'posts', :action => 'update', :conditions => {:method => :post} 

map.resources :posts, :conditions => {:method => :post} 

现在只有在您有效发布帖子时才会调用PostsController的更新方法。查看resources的文档。

答案 5 :(得分:5)

GET和POST参数之间存在差异。 POST HTTP请求仍然可以有GET参数。

GET参数是URL查询参数。

POST参数是HTTP请求正文中的参数。

你可以从request.GET和request.POST哈希中单独访问它们。

答案 6 :(得分:4)

如果它是GET方法,

request.get?将返回布尔值true,

如果它是POST方法,

request.post?将返回布尔值true,

答案 7 :(得分:2)

您无需知道控制器中的详细程度。您的路由和表单将导致将相应的项添加到params哈希。然后在控制器中,您只需访问说params[:foo]以获取foo参数,并使用它执行任何操作。

在大多数现代Rails代码中,config/routes.rb中设置了GET和POST(以及PUT和DELETE)和控制器操作之间的映射。

答案 8 :(得分:1)

如果你知道我的意思,我认为你想要做的不是“Rails”。您的GET请求应该幂等 - 您应该能够多次发出相同的GET请求并且每次都获得相同的结果。

答案 9 :(得分:0)

我认为Jesse Reiss正在谈论的是你的routes.rb档案中的情况

post 'ctrllr/:a/:b' => 'ctrllr#an_action'

你发布到“/ ctrllr / foo / bar?a = not_foo” POST值 {'a'=> 'still_not_foo'} ,你将有三个不同的'a'值:'foo','not_foo'和'still_not_foo'

控制器中的'params'将'a'设置为'foo'。要找到'a'设置为'not_foo'和'still_not_foo',您需要检查request.GETrequest.POST

我写了一个gem来区分https://github.com/pdxrod/routesfordummies处的这些不同的key =>值对。

答案 10 :(得分:0)

if request.query_parameters().to_a.empty?