paperclip gem (v 3.4.0) を使用する 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
ご覧のとおり、投稿には写真が添付されている場合があります。私はクリップを使ってこれらの添付ファイルを管理しています。
これらの投稿をクライアント上で動的に POST するフォームを javascript/jquery で生成します。私の問題はこれです。. . 投稿に写真の添付ファイルが含まれていない場合、すべてが完全に機能します。ただし、投稿に写真が添付されている場合、次のエラー メッセージが表示され、投稿が投稿されません。
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'));
}
});
しかし、それでは問題は解決しません。上で述べたように、ヘッダーを確認するためにリクエスト ヘッダー データを確認することさえできません。
ペーパークリップが問題を引き起こす理由を誰か思いつくことができますか?