获取原始参数而不是“加工成哈希”版本

时间:2011-06-22 14:36:02

标签: ruby-on-rails ruby-on-rails-3

Rails 3问题。

如果我发送这样的请求PUT http://myapp/posts/123?post[title]=hello

然后在我的控制器中我得到params = {:id => 123, :post => {:title => "hello"}}

这通常很好,通常对例如Post.create(params[:post])

有用

然而,在这种情况下我需要访问params的'raw'形式,所以我可以命令它们取出值,将它们全部作为简单的字符串处理,即我希望它们列出,所以param名称是"post[title]",参数值为"hello"

我有什么方法可以获得这些价值观吗?我认为可能有一种request的方法,它有原始的拉链形式的参数但我找不到。

我尝试将哈希转换回带有to_param的字符串,但这看起来很脏但可能是不必要的。

作为奖励,我希望它忽略:id参数,字面上只是参加了?在原始请求中。事实上,如果我可以回到原始请求字符串,即"http://myapp/posts/123?post[title]=hello",那么这样做:我可以拆分?并从那里拿走它。我刚刚想到我可以从标题中得到它。在此期间,如果有人知道更好的方式,那么请告诉我:)

感谢任何建议 - 最多

2 个答案:

答案 0 :(得分:7)

请不要手动解析。从Rails request

中获取URI
url = request.url
# Or, depending on the Rails version and stack
url = request.request_uri
# Or even
url = request.scheme + '://' + request.host_with_port + request.fullpath

request.url的返回值似乎取决于您的服务器堆栈,request.request_uri应该解决这个问题但Rails 3.1中似乎不存在。第三个“自己构建”方法应该在各处产生一致的结果。叹息。

然后,一旦你有了URI,使用URI.parseURI.decode_www_form来解析它:

u = URI.parse(url)
q = URI.decode_www_form(u.query)
# if u.query was "a=b&c=d&a=x" then q is
# [["a", "b"], ["c", "d"], ["a", "x"]]

答案 1 :(得分:3)

Request#bodyRequest#uri可以为您提供帮助。您可以获取“原始”请求数据,但不能获得某些中间形式...虽然如果您想要键值对,并不是很难在“&”号中分割,然后再次在“=”处分开;)