2011-10-07 136 views
2

我需要通过ruby脚本从办公室计算机发布到远程服务器。每次我尝试,我得到“你想改变被拒绝”,当我看看日志,我得到rails skip_before_filter:verify_authenticity_token不工作

ActionController::InvalidAuthenticityToken 

我误解的东西的时间已经把

skip_before_filter :verify_authenticity_token 
控制器

了吗? 下面是从Ruby脚本

url="display_ad[title]=#{row[1]}" 
    date_arr = row[2].split('/') 
    start_date = date_arr[2].to_s + "-" + date_arr[0].to_s + "-" + date_arr[1].to_s 
    url+="&display_ad[start_date]=#{start_date}" 

    date_arr = row[3].split('/') 
    end_date = Date.new(date_arr[2].to_i, date_arr[0].to_i, date_arr[1].to_i) 
    end_date = end_date + 7 
    end_date = end_date.strftime("%Y-%m-%d") 
    url+="&display_ad[end_date]=#{end_date}" 
    url+="&display_ad[slug]=#{row[7]}" 
    url+="&display_ad[category]=othr" 
    url = url.gsub("\n","") 
    url = url.gsub("\r","") 
    p url 
    easy = Curl::Easy.http_post("http://example.com/advertising/web/web_service_add", url) 

并在控制器动作

ad = DisplayAds.new(params[:display_ad]) 
ad.save 
+0

你能提供一些关于你的代码的更多细节吗? – rookieRailer

+2

真的很奇怪,跳过过滤器没有帮助,但你可以尝试'protect_from_forgery:only => []' – Bohdan

+0

不幸的是,我不得不将它改为GET,因为时间有限。 – hforbess

回答

0

我登陆这个页面上具有一个Rails 2.3.8项目同样的问题后的代码。我在几个控制器中成功地使用了skip_before_filter :verify_authenticity_token,但是这是我第一次尝试在应用程序控制器中定义的动作的ApplicationController类的顶部使用它。

我按照预期将我的操作和skip_before_filter行一起移动到了另一个控制器,并正确禁用了验证。我认为这可能是问题所在,如果您直接在应用程序控制器中使用该类中定义的操作,则可能不会如您所期望的那样工作。我还没有调查过这可能是什么原因,因为我的懒惰编码是,我正在努力的具体行动已经定义在那里,所以移动它是一个更好的选择。遇到此问题的其他人应尝试将其受影响的操作移出ApplicationController课程。

有趣的是,在一个Rails 3.2.1项目中,我在ApplicationController中使用了skip_before_filter :verify_authenticity_token,并在该类中定义了一个动作,它工作正常。

0

请检查你的代码是否此行:

protect_from_forgery 

它将开始CSRF保护。请记住,在此方法之后放置所有sckip_before_filter。

幸运!