11

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'));
  }
});

しかし、それでは問題は解決しません。上で述べたように、ヘッダーを確認するためにリクエスト ヘッダー データを確認することさえできません。

ペーパークリップが問題を引き起こす理由を誰か思いつくことができますか?

4

3 に答える 3

1

上記の質問を最初に投稿してからしばらく経っていることは承知していますが、人々はまだ検索でそれを見つけているので、回答で物事を更新すると思いました.

上で説明した問題は、Paperclip とは何の関係もありません。ファイルが添付されたフォームの送信を処理するために remotipart.js を使用しているため、フォームは csrf トークンなしで送信されています。Remotipart は、フォーム データを i-frame にコピーすることで ajax のようなフォームの送信を可能にします。これにより、サイトがアクティブなままである間に、通常の (つまり、ajax 以外の) 送信が行われます。i-frame を介した ajax ファイルのアップロードの詳細については、この記事を参照してください。

以前のバージョンの remotipart では、csrf トークンが i-frame によって送信されるフォームにコピーされませんでした。remotipart をサポートしている善良な人々は、この欠点を修正しました。ここで修正を見つけることができます

于 2013-11-14T05:36:46.450 に答える
0
$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('X-CSRF-Token',
                             $('meta[name="csrf-token"]').attr('content'));
    }
});

jsで

そしてレイアウトで

<%= csrf_meta_tags %>

ファイルは、それを機能させるのに十分なはずです。

それ以外の場合はjquery-rails、CSRF トークンを処理する gem を使用できます

于 2013-06-07T03:09:05.227 に答える
0

これは、問題を解決するために必要なものです。

https://github.com/JangoSteve/remotipart

于 2017-01-09T10:53:57.333 に答える