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"
,那么这样做:我可以拆分?并从那里拿走它。我刚刚想到我可以从标题中得到它。在此期间,如果有人知道更好的方式,那么请告诉我:)
感谢任何建议 - 最多
答案 0 :(得分:7)
请不要手动解析。从Rails request:
中获取URIurl = 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.parse
和URI.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#body
和Request#uri
可以为您提供帮助。您可以获取“原始”请求数据,但不能获得某些中间形式...虽然如果您想要键值对,并不是很难在“&”号中分割,然后再次在“=”处分开;)