我的应用中有一个表单触发了错误的控制器操作。这是渲染的形式:
<form id="edit_profile_1" class="simple_form profile windowed" method="post" enctype="multipart/form-data" action="/profiles/1" accept-charset="UTF-8">
<div style="margin:0;padding:0;display:inline">
<input type="hidden" value="✓" name="utf8">
<input type="hidden" value="put" name="_method">
<input type="hidden" value="..." name="authenticity_token">
</div>
....
</form>
所以,几乎是一种正常的形式。在我的本地环境中,这可以正常工作,它会触发profiles#update
操作。但是,当由于某种原因部署在Heroku上时,这会触发profiles#show
操作,因此无法正常工作。
是什么给出的?之前有没有人遇到过这个错误,你知道如何修复它吗?
-EDIT- @Laas:这是生产日志:
2011-05-20T21:41:38+00:00 app[web.1]: Started GET "/account" for 98.201.59.6 at 2011-05-20 14:41:38 -0700
2011-05-20T21:41:40+00:00 heroku[router]: GET www.fourthenvironment.org/account dyno=web.1 queue=0 wait=0ms service=2212ms bytes=8672
2011-05-20T21:41:40+00:00 app[web.1]: Connected to NewRelic Service at collector-6.newrelic.com:80
2011-05-20T21:41:40+00:00 heroku[router]: GET www.fourthenvironment.org/javascripts/rails.js dyno=web.1 queue=0 wait=0ms service=2ms bytes=5176
2011-05-20T21:41:41+00:00 heroku[router]: GET www.fourthenvironment.org/javascripts/jquery.144.min.js dyno=web.1 queue=0 wait=0ms service=3ms bytes=78865
2011-05-20T21:41:42+00:00 heroku[router]: GET www.fourthenvironment.org/stylesheets/style.css dyno=web.1 queue=0 wait=0ms service=3ms bytes=63444
2011-05-20T21:41:47+00:00 heroku[router]: GET www.fourthenvironment.org/favicon.ico dyno=web.1 queue=0 wait=0ms service=4ms bytes=1672
2011-05-20T21:41:50+00:00 app[web.1]:
2011-05-20T21:41:50+00:00 app[web.1]:
2011-05-20T21:41:50+00:00 app[web.1]: Started POST "/profiles/1" for 98.201.59.6 at 2011-05-20 14:41:50 -0700
2011-05-20T21:41:50+00:00 heroku[router]: POST www.fourthenvironment.org/profiles/1 dyno=web.1 queue=0 wait=0ms service=102ms bytes=420
2011-05-20T21:41:50+00:00 app[web.1]: THIS SHOULD NOT BE TRIGGERED
2011-05-20T21:41:50+00:00 heroku[router]: GET www.fourthenvironment.org/profiles/1 dyno=web.1 queue=0 wait=0ms service=30ms bytes=414
2011-05-20T21:41:50+00:00 app[web.1]:
2011-05-20T21:41:50+00:00 app[web.1]:
2011-05-20T21:41:50+00:00 app[web.1]: Started GET "/account" for 98.201.59.6 at 2011-05-20 14:41:50 -0700
请注意“这不应该被触发”。这是控制器:
class ProfilesController < ApplicationController
before_filter :authenticate_user!
def show
puts "THIS SHOULD NOT BE TRIGGERED"
redirect_to account_path
end
def edit
@profile = Profile.find(params[:id])
end
def update
puts "profiles#update"
@profile = Profile.find(params[:id])
if @profile.update_attributes(params[:profile])
redirect_to account_path, :notice => t('user.notice.updated')
else
render :action => 'edit'
end
end
end
答案 0 :(得分:1)
事实证明这个问题与SSL-Requirement Gem的使用有关。出于某种原因,如果您在使用SSL要求时从SSL页面向非SSL页面发送请求,则会将其重定向。因此,要修复,请在请求的两端启用SSL要求,它将起作用。看起来从SSL到非SSL,gem只允许获取 - 因此是bug。这看起来与Rails 3.1无关,因为新的SSL要求功能将被烘焙,并且不需要gem。
非常感谢Heroku员工帮助隔离了这一点。
答案 1 :(得分:0)
似乎与此问题routing-issues-with-multi-part-forms-on-heroku相同。
由于只有几天的时间,也许这不是巧合,而且Heroku有什么不妥?
答案 2 :(得分:0)
为什么表单标签是硬编码的?使用form_tag帮助
http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html