我碰到一个奇怪的问题,之后一堆研究不能得到任何接近。 我已经得到了通过Carrierwave上传文件几种形式。 当我上传的信息,该路线的一部分被切断(我认为)。
例如,我有一个多部分的形式提交到:
HTTPS:/域名/程序/ 223 / add_file为POST
但在提交我得到的错误
无路由匹配[POST] “/ 223 / add_file”
即使有什么在我的地址栏是一个完整的路线。 如果提交完整的路线为GET请求它工作正常。 当我运行耙路线的路线显示出来就好了。
下面是我的路线的一个子集:
resources :programs do
match "add_file" => "programs#add_file"
如果它的事项,我运行的Rails 3.2.2与Apache的乘客。 该问题只发生这种生产服务器上,从来没有在开发中。
有任何想法吗? 我被困在这一个,因为它影响多条路线,我已经试过只定义为形式,没有运气的自定义路线。
更新:当我删除多部分=>真或从形式file_field_tag它解决了这个问题。 这仍然是一个问题,但似乎少约比约与上传文件的形式进行路由选择。
创建passenger_extension.rb
在lib
使用此代码文件夹:
乘客3
module PhusionPassenger
module Utils
protected
NULL = "\0".freeze
def split_by_null_into_hash(data)
args = data.split(NULL, -1)
args.pop
headers_hash = Hash.new
args.each_slice(2).to_a.each do |pair|
headers_hash[pair.first] = pair.last unless headers_hash.keys.include? pair.first
end
return headers_hash
end
end
end
乘员5
module PhusionPassenger
module Utils
# Utility functions that can potentially be accelerated by native_support functions.
module NativeSupportUtils
extend self
NULL = "\0".freeze
class ProcessTimes < Struct.new(:utime, :stime)
end
def split_by_null_into_hash(data)
args = data.split(NULL, -1)
args.pop
headers_hash = Hash.new
args.each_slice(2).to_a.each do |pair|
headers_hash[pair.first] = pair.last unless headers_hash.keys.include? pair.first
end
return headers_hash
end
def process_times
times = Process.times
return ProcessTimes.new((times.utime * 1_000_000).to_i,
(times.stime * 1_000_000).to_i)
end
end
end # module Utils
end # module PhusionPassenger
然后在“配置/ application.rb中”做:
class Application < Rails::Application
...
config.autoload_paths += %W(#{config.root}/lib)
require 'passenger_extension'
end
然后重新启动Web服务器。
注意:我不知道,这不会破坏任何其他功能,因此使用它自己的风险,请让你找到这种做法造成任何伤害我。
这里的一个问题是你没有指定路线是否在收集或成员定义。 其中哪一个是正确的路径?
programs/:id/add_file
programs/add_file
您应该构建您的路线是这样的:
resources :programs do
post 'add_file', :on => :member
end
要么
resources :programs do
member do
post 'add_file'
end
end
以上将POST请求的programs/:id/add_file
并将它们发送到ProgramsController.add_file
与params[:id]
作为程序ID。
如果你想在此集合,你可以这样做:
resources :programs do
post 'add_file', :on => :collection
end
要么
resources :programs do
collection do
post 'add_file'
end
end
这将需要在POST请求的programs/add_file
并将它们发送到ProgramsController.add_file
,但没有params[:id]
将被设置。
一般来说,你应该总是指定路由是否在收集或成员,并应指定的动词的路线应该接受(即使用“获取”或“邮报”等来代替“匹配”)。
试试上面,看看是否能解决你的问题,如果不是请让我知道,我会再看看。
我想你可能需要添加
:via => [:post]
你的路径确定。 这似乎很奇怪,它会发展,而不是生产工作,但据我所知轨路由,你已经添加的匹配只会获得响应。
试着改变你的比赛
match "add_file" => "programs#add_file", :via => [:post]
此外,根据刚刚由安德鲁提交的答案,你可能使用过的成员说明是明确的事实,操作发生在特定程序与特定的ID,而不是收集更好。 还应该保存在你的add_file方法,这可能是努力得到的URL参数id一些代码。