Rails:为什么这个表单会触发错误的操作?

时间:2011-05-20 21:48:00

标签: ruby-on-rails ruby-on-rails-3 forms controller heroku

我的应用中有一个表单触发了错误的控制器操作。这是渲染的形式:

<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

3 个答案:

答案 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