ruby-on-rails-3 – Paperclip宝石触发CSRF令牌验证问题

我有一个使用回形针宝石(3.4版)的Rails 3.1应用程序.简而言之.我有一个故事模型和一个后期模型.一个故事可以有很多帖子.
#story.rb

class Story < ActiveRecord::Base

  attr_accessible :title,:user_id,:username,:posts_attributes

  belongs_to    :user
  has_many      :posts,:dependent  =>  :destroy,:order => "created_at DESC"

  accepts_nested_attributes_for :posts,:reject_if => lambda { |t| t['contents'].nil? }

end
#post.rb

class Post < ActiveRecord::Base

  attr_accessible :contents,:photo,:dimensions

  belongs_to    :story,:touch => true
  belongs_to    :user,:touch => true

  has_attached_file :photo,:styles => { 
                      :medium => { :geometry => "400x400>" },:thumb => { :geometry => "100x100>" },},:processors => [:thumbnail],:storage => :s3,:s3_credentials => "#{Rails.root.to_s}/config/s3.yml",:path => "/:style/:id/:filename"


  before_save   :extract_dimensions

  serialize   :dimensions

  validates   :contents,:presence   => true,:length         => {  :maximum => 399,:minimum => 5 } 
  validates   :user_id,:presence => true

  validates_attachment_content_type :photo,:content_type => ['image/jpeg','image/png','image/gif','image/jpg'],:message => "Sorry,we don't support that type of image format"

end

如您所见,帖子可能附有照片附件.我使用回形针来管理这些附件.

生成使用javascript / jquery在客户端上动态发布这些帖子的表单.我的问题是这个. . .如果帖子不包含照片附件,一切都可以完美. IF,但是,如果POST有照片附件,我收到以下错误消息,该帖子不POST:

WARNING: Can't verify CSRF token authenticity
  User Load (0.5ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 61 LIMIT 1
   (0.3ms)  BEGIN
   (0.2ms)  COMMIT
Completed 401 Unauthorized in 238ms

结果,我的会话数据被破坏,我甚至不能看到与Firebug的请求头. put请求根本不会出现在firebug中.

现在,毫不奇怪,我可以在PostController中解决以下问题:

skip_before_filter :verify_authenticity_token,:only => [:create]

但我不想放弃这种安全.我也尝试通过js / jquery将CSRF头添加到我的表单中:

jQuery.ajaxSetup({ 
  beforeSend: function(xhr) {
    xhr.setRequestHeader('X-CSRF-Token',$('Meta[name="csrf-          
            token"]').attr('content'));
  }
});

但是这并不能解决问题,正如我上面所说的,我甚至看不到请求头数据来看头.

任何人都可以看出纸夹是否触发问题的原因?

解决方法

我知道,自从我第一次发布上述问题以来,已经有一段时间了,但是人们仍然在搜索中找到它,所以我以为我会用一个答案来更新.

上面讨论的问题与Paperclip无关.由于我使用的是remotipart.js来处理提交具有文件附件的表单,因此该表单正在提交而无需使用csrf令牌. Remotipart通过将表单数据复制到i框架中,使表单类似于ajax,从而在您的站点保持活动状态时提供正常的(即非ajax)提交.有关通过i-frame进行的ajax文件上传的更详细的描述,请参见this article.

在以前的remotipart版本中,csrf令牌未被复制到i-frame提交的表单中.支持远程的好人现在已经解决了这个缺点.你可以找到修复here

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...