4

我有一个控制器操作,只能由登录的用户访问。如果用户没有登录,我想将他们重定向到登录表单,这是一个 ajax 驱动的灯箱。虽然初始请求是html格式的,但我需要更改为js. 现在,我正在尝试这样:

def new
  if user_signed_in?
    @company = Company.new
  else
    redirect_to new_user_session_path, format: 'js'
  end
end

不幸的是,它仍然将重定向视为html格式。有没有办法让重定向被视为js

4

3 回答 3

0

我在 rails 3.2.13 n 中尝试过这个,它可以工作,我希望它可以解决

if user_signed_in?
  .....
else
  if request.xhr?
    flash[:notice] = "Please login."
    flash.keep(:notice)
    render :js => "window.location = #{new_user_session_path}"
  else
    .....
  end
end
于 2013-08-30T01:26:38.487 回答
0

我认为您可能正在寻找一个 respond_to 块以及前面提到的过滤器之前提到的块:

class CompaniesController < ApplicationController
  before_filter :login

  def new 
    @company = Company.new

    render json: @company, layout: false # layout false if you do not want rails to render a page of json
  end

  private

  def login
    if !user_signed_in?
     #your login code here
    end
  end
end

不要忘记将 dataType ajax 选项设置为 json:

$.ajax({
    url: "company/new" //your rails url, what is there is just my best guess
    data: query, //whatever paramaters you have
    dataType: "json", // or html, whichever you desire
    type: "GET",
    success: function (data) {
        //your code here
    }
 });
于 2013-08-30T01:31:58.130 回答
0

对于任何来到这里并使用 Rails 5 的人,我都这样做了,如果有人在想要重定向时在控制器 youractionname 函数中设置了一个@redirect 变量,这将在 youractionname.js.erb 文件中工作。

# ruby control flow
<% if @redirect != nil %>
  // javascript call to use rails variable as redirect destination.
  location.replace("<%=@redirect%>");
<% end %>
于 2018-09-11T22:37:56.110 回答