ブロックの先頭にauthenticate_or_request_with_http_basic
への呼び出しを追加すると、動作しているコントローラの動作が壊れます。ここでは機能していないアクションコードは次のとおりです。AbstractController :: DoubleRenderErrorを受け取ったときauthenticate_or_request_with_http_basic()
def index
authenticate_or_request_with_http_basic do |username, password|
username == "test1" and password == "test"
end
render layout: false, content_type: 'application/xml'
end
私は、次のメッセージと私のブラウザウィンドウ内の「AbstractController :: DoubleRenderError」エラー応答を受信しています:
と呼ばれていたレンダリングおよび/またはリダイレクトこのアクションで複数回レンダリングまたはリダイレクトを呼び出すことができるのは1回の操作につき1回だけです。また、リダイレクトもレンダリングもアクションの実行を終了させないので、リダイレクト後にアクションを終了するには、 "redirect_to(...)and return"のような処理が必要です。
私は別のアクションで「authenticate_or_request_with_http_basic」のロジックを配置し、indexアクションのためにそれを実行するためにbefore_filterを設定すると、すべてが順調です。しかし、私はインデックス以外のアクションでこのロジックを再利用しているわけではないので、上記のコードが機能しない理由を知りたいと思います。
ソリューション
私はタイラーとRKBの助けを借りて解決策を見つけることができました。ここにあります:
authenticated = authenticate_or_request_with_http_basic "Authentication Required" do |username, password|
@user = User.find_by_username(username)
@user != nil && password == "test"
end
return unless authenticated == true
認証が成功した場合は "true"を返します。失敗すると401を返します。
その場合、authenticate_or_request_with_http_basicがfalseを返すと、アクションのさらなる実行を中止するにはどうすればよいですか? –
私はauthenticate_or_request_with_http_basicコールをbefore_filterに配置します。 – rkb
1回のアクション内で、さらに実行が停止することはありますか? –