在 Rails 中将 redirect_to 格式更改为 :js

Posted

技术标签:

【中文标题】在 Rails 中将 redirect_to 格式更改为 :js【英文标题】:Change redirect_to format to :js in Rails 【发布时间】:2013-09-02 13:52:08 【问题描述】:

我有一个控制器操作,只能由已登录的用户访问。如果用户未登录,我想将他们重定向到登录表单,这是一个 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

【问题讨论】:

你试过之前的过滤器吗? guides.rubyonrails.org/action_controller_overview.html 感谢您的提示!这大大清理了我的代码,但它并没有解决我遇到的主要问题,即将格式从html 更改为js。如果对此有更多提示,请告诉我。 我认为您可能必须将它们重定向到一个页面,然后触发 light osx box modal。 @simonmorley 这是我最终使用的方法。 【参考方案1】:

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

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

【讨论】:

不幸的是,在 4.0 中这不起作用。 js 仍然呈现为html,所以我得到的只是一个带有文本render :js => "window.location = #new_user_session_path" 的未格式化页面。不过还是谢谢。【参考方案2】:

我认为您可能正在寻找一个 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
    
 );

【讨论】:

感谢您的回复。不幸的是,问题是“新公司”的链接不是remote: true,所以我发送的是html 格式的请求,而不是js。不知何故,我需要告诉 Rails 以 js 的形式返回请求。 如果您只想从此控制器方法返回 json,您所要做的就是渲染 json:@company,layout:false。我编辑了答案以包含此代码。 不幸的是,这不起作用。也许 Rails 4 发生了一些变化?【参考方案3】:

对于任何来到这里并使用 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 %>

【讨论】:

以上是关于在 Rails 中将 redirect_to 格式更改为 :js的主要内容,如果未能解决你的问题,请参考以下文章

Rails redirect_to - 我也想重新加载页面

如何将redirect_to()与rails 3中当前params []数组中的所有内容一起使用?

管理命名空间中的 redirect_to 对象

处理 Rails 中 STI 子类的路由的最佳实践

在rails中将字符串转换为数组

支付成功后渲染视图