我遇到了Devise' before_action :authenticate_user!
选项remote: true
过滤。
我有一个链接标记,可以向我messages#read
以下的MessagesController
发送正常的PUT请求
<%= link_to 'Mark Read/Unread', read_message_path(message), method: :put %>
class MessagesController < ApplicationController
before_action :authenticate_user!, only: :read
before_action :set_message, only: :read
...
#http PUT
def read
@message.toggle!(:read)
respond_to do |format|
format.html { redirect_to messages_url, notice: 'Message was successfully destroyed.' }
format.json { head :no_content }
end
end
...
end
如果用户未登录,则会将其重定向到登录页面,作为预期的设计行为。
但是,在链接上设置 remote: true
选项时,例如
<%= link_to 'Mark Read/Unread', read_message_path(message), method: :put, remote: true %>
设计中断错误:PUT http://localhost:3000/users/sign_in.js 404 (Not Found)
我的日志输出401 Unauthorized
后跟
ActionController::RoutingError (No route matches [PUT] "/users/sign_in.js")
问题是Rails尝试通过PUT渲染/users/sign_in.js
,而PUT不存在且不应该。这就是让我感到困惑并让我感到困惑的原因,因为我会考虑重定向到设计/users/sign_in
html页面,而Rails尝试渲染一个带有.js
扩展名的sign_in页面。
我尝试将config/initializers/devise.rb
行设置为
config.http_authenticatable_on_xhr = false
config.navigational_formats = ['*/*', :html, :js]
。
我正在使用Devise的默认设置。没有特殊路线也没有控制器。
我在这里缺少什么?我是否误解了Devise的工作方式?
是否可以覆盖authenticate_user!
重定向以设计&#39;关于xhr请求的默认sign_in html页面?
答案 0 :(得分:0)
在进行jquery ajax调用时遇到了类似的问题。 奇怪的是它正在使用button_to远程调用。
我的解决方案是将方法更改为POST
,将预期的响应类型更改为script
:
$.ajax({
url: myurl,
type: 'POST',
data: {myvar: myval},
dataType: 'script',
答案 1 :(得分:-1)
如果用户未登录,请勿显示该链接。