Rails 关于 Rails 中的路由问题

ecloud · 发布于 2018年01月11日 · 最后由 liuminhan 回复于 2018年01月11日 · 320 次阅读
96

我再routers中写下如下的路由,然后POST地址 /weixin,出现错误 No route matches [POST] "/weixin"

scope :path => '/weixin', :via => :post do
        match "/", :to => 'weixin#method_text', :constraints => lambda{|request| Nokogiri::XML(request.body.read).xpath('//MsgType').text == 'text'}
        match "/", :to => 'weixin#method_image', :constraints => lambda{|request| Nokogiri::XML(request.body.read).xpath('//MsgType').text == 'image'}
        match "/", :to => 'weixin#method_location', :constraints => lambda{|request| Nokogiri::XML(request.body.read).xpath('//MsgType').text == 'location'}
        match "/", :to => 'weixin#method_event', :constraints => lambda{|request| Nokogiri::XML(request.body.read).xpath('//MsgType').text == 'event'}
end

但是我这样写是可以的

scope :path => '/weixin', :via => :post do
        match "/", :to => 'weixin#method_event', :constraints => lambda{|request| Nokogiri::XML(request.body.read).xpath('//MsgType').text == 'event'}
end

不太懂是什么原因,求教各位

共收到 19 条回复
60a8f6

这路由看得头疼..

96

@msl12 路由有点长,根据微信POST过来的MsgType选择方法。

96

@msl12 我刚才又改变了下,只有匹配第一个才能成功,不知道为什么。

96

@msl12 找到原因了,每次read后需要seek 0。

60a8f6
32ecloud 回复

成功了?

96
60a8f6msl12 回复

是的。因为每次read导致position指向最后,后面的read就读不到内容了

7楼 已删除
96

我刚才试了一下,后面的路由还是匹配错误,应该是Nokogiri::XML中还是使用read

15473

我这么写的可以,加个解析xml的gem

scope :path => "/weixin", :via => :post do
   match "/", :to => 'weixin#method_text', :constraints => lambda { |request| request.params[:xml][:MsgType] == 'text' }
   match "/", :to => 'weixin#method_image', :constraints => lambda { |request| request.params[:xml][:MsgType] == 'image' }
   match "/", :to => "weixin#method_location",:constraints => lambda { |request| request.params[:xml][:MsgType] == 'location' }
   match "/", :to => "weixin#method_event",:constraints => lambda { |request| request.params[:xml][:MsgType] == 'event'}
end
gem actionpack-xml_parser, ~> 1.0.1
96
15473liuminhan 回复

你应该使用了actionpack-xml_parser 这个gem吧,我试了下这个Gem,按照教程没法使用。

96

@liuminhan 能给我一份使用教程吗?github上也没找到可用的doc

15473
32ecloud 回复

config.middleware.insert_after ActionDispatch::ParamsParser, ActionDispatch::XmlParamsParser

这个加了没?

96

@liuminhan 加了这一句没法启动了

uninitialized constant ActionDispatch::XmlParamsParser (NameError)
96

好吧,目前我用的最笨的办法,每次read前使用seek 0,如果谁有更好的办法请告诉我,感谢💯

15473
32ecloud 回复

我之前是用的4.x的rails 版本

96

@liuminhan 我用的是5.x的rails,可能版本太新了

1

试试 request.raw_post

96
1Rei 回复

完美解决,感谢/:strong

1
15473liuminhan 回复

提醒:xml parser 以前出过远程执行漏洞,后来 rails 就干脆剥离了,目前维护热度肯定不高,为了安全最好别用。

15473
1Rei 回复

就是微信的时候用过一次,后来就没有遇到过这样的场景了,多谢提醒

32 ecloud 关闭了讨论 01月12日 11:19
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册