Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 重定向不工作_Ruby On Rails_Ruby_Ruby On Rails 3_Redirect - Fatal编程技术网

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没有执行。