0

devisegemを追加して構成しました。フォームの自動保存AJAX呼び出しをブロックすることを除いて、うまく機能しています。

私のコントローラーの上部には、次のものがあります。

before_filter :authenticate_user!

私のAJAX呼び出しは同じコントローラーに届きます:

  def autosave
    #TODO: update relative entry
    #TODO: verify user logged in
    #TODO: verify entry belongs to relative user
    render content_type: 'text/xml', inline: "<result status='ok' />"
  end

もちろん、代わりに次のようにbeforeフィルターを宣言することもできます。

before_filter :authenticate_user!, except: :autosave

..しかし、これは誰もがいつでもこのコントローラー関数を呼び出すことを妨げるものではありません。

この関数を呼び出せるようにするための最良の方法は何でしょうか?ログインしているユーザーだけが電話をかけることができ、編集している特定のレコードがそのユーザーに属していることを確認したいと思います。

4

1 に答える 1

1

何をしようとしているのか完全にはわかりませんが、自動保存に少しロジックを追加する必要があるようです。この設定では、関数自体は引き続き呼び出されますが、条件が正しくない限り、関数が何かを実行するかどうかはまったく別の問題です。

def autosave
  #Verify that the user is signed in and he has ownership of entry
  if !current_user.nil? && entry.user == current_user
    render content_type: 'text/xml', inline: "<result status='ok' />"
  else
    #do nothing nothing or redirect with error here
  end  
end

AJAX の投稿を作成しているため、セキュリティ対策として ajax 呼び出しに追加情報、つまり CSRF セキュリティ トークンを提供する必要があります。セキュリティ トークンを使用した AJAX リクエストの例については、正しい x-csrf-token がリクエスト ヘッダーに含まれているにもかかわらず、Devise が Ajax 投稿で current_user を設定していないを参照してください 。また、必ず<%= csrf_meta_tag %>head タグにも含めてください。

于 2012-11-08T17:37:58.267 に答える