Ruby on rails 重定向不工作
我的投票控制器中有一行:Ruby on rails 重定向不工作,ruby-on-rails,ruby,ruby-on-rails-3,redirect,Ruby On Rails,Ruby,Ruby On Rails 3,Redirect,我的投票控制器中有一行: before_filter :authenticate if @vote.save respond_to do |format| format.html { redirect_to @video } format.js end else respond_to do |format| format.html end end 所以当我在注销时投票时,它会使这个过滤器失效 我的应用程序控制器中的身
before_filter :authenticate
if @vote.save
respond_to do |format|
format.html { redirect_to @video }
format.js
end
else
respond_to do |format|
format.html
end
end
所以当我在注销时投票时,它会使这个过滤器失效
我的应用程序控制器中的身份验证方法如下所示:
def authenticate
logged_in? ? true : access_denied
end
def access_denied
redirect_to login_path, :notice => "You must log in to perform this action." and return false
end
因此它返回access\u denied
,如下所示:
def authenticate
logged_in? ? true : access_denied
end
def access_denied
redirect_to login_path, :notice => "You must log in to perform this action." and return false
end
因此,我应该被重定向到我的登录页面,对吗
我的routes.rb文件中有:
match '/login' => "sessions#new", :as => "login"
我有一个新的
视图,其中有一个登录表单,当我投票但未登录时,应该重定向到该表单。我的投票控制器的create
方法中也有此代码:
before_filter :authenticate
if @vote.save
respond_to do |format|
format.html { redirect_to @video }
format.js
end
else
respond_to do |format|
format.html
end
end
但是,当我投票时,我没有被重定向,我在日志中收到以下错误消息:
Started GET "/login" for 127.0.0.1 at Thu Mar 24 21:18:08 -0700 2011
Processing by SessionsController#new as JS
Completed in 17ms
ActionView::MissingTemplate (Missing template sessions/new with {:locale=>[:en, :en], :formats=>[:js, "*/*"], :handlers=>[:rhtml, :rxml, :erb, :builder, :rjs]} in view paths "/rubyprograms/dreamstill/app/views"):
为什么会发生这种情况,我如何才能使重定向工作?因为导致问题的请求是ajax,请尝试在before_过滤器中添加一个检查,以确定请求是否为js
if request.xhr?
render :text => "document.location = '#{login_path}';", :layout => false
else
redirect_to login_path, ...
end
您似乎正在向VotesController#create action发出javascript请求,但缺少会话的JS模板#new 发生的情况如下:您调用VotesController#create作为JS调用,当用户登录时一切正常,因为VotesController#创建对javascript操作的响应。问题是,如果用户未登录,请求将重定向到SessionController#new,并且请求仍然是javascript请求。问题是SessionController#new不响应JS,因此会出现缺少模板错误 我建议添加app/views/sessions/new.js.erb文件来处理js调用。您现在可能只有app/views/sessions/new.html.erb文件 您还可以通过使用javascript重定向到HTML请求来处理这种情况。您可以通过将以下内容添加到新的.js.erb模板中来完成此操作:
window.location = "<%= escape_javascript(login_path) %>";
window.location=”“;
这基本上会告诉浏览器重定向到登录路径,就像请求是HTML请求而不是Javascript请求一样。我已经用更多细节和简单的重定向解决方案更新了我的答案。为什么我需要一个js文件来进行新会话?我不明白为什么我需要它,里面应该放些什么。。。当
@vote.save
失败时,为什么我不能求助于普通的HTTP请求呢?如果请求是作为Javascript请求从浏览器发出的,例如通过AJAX请求,那么您就不能用HTML内容进行响应,因为浏览器不知道如何处理响应。您需要使用Javascript进行响应,就像我的示例代码一样,可以使用浏览器的Javascript引擎运行。这就是HTTP协议的工作方式。这对Rails来说并不特别,这是有道理的,但我不明白的是为什么它仍然是一个js请求。我在if@vote.save
块中有format.js
,所以不应该调用它。什么使它仍然是js请求?您指的是响应块,而不是请求块。format.js表示响应js请求。html部分说用“重定向到@video”响应html请求。正如前面所说的,js请求不会以同样的方式响应http响应。因此,如果返回301或302重定向,它将忽略它们,这就是为什么要实现重定向,必须添加js代码。我不喜欢将这样的代码放在一个新的.js.erb文件中,因为js的处理是隐藏的。通过在controller方法中渲染js代码来保持清晰。我发现这在我的ApplicationController中很有用,在那里我有几个全局的rescue\u from
条件。我发现我可以在render
之前插入flash[:alert]=message
语句,以便在我重定向到的页面上获得“正常”错误消息。我分配了window.location
,因为这显然是更普遍的可写性()。我想我不能分配302状态?当我将:status=>302
添加到渲染中时,JavaScript没有执行。