(Ruby,Rails,Javascript)当Javascript被禁用时,重定向/渲染不同的页面......?

时间:2009-06-20 00:13:53

标签: javascript ruby-on-rails redirect render

我在使用Rails,Javascript和重定向时遇到了严重问题。基本上我有一个“简单”的问题,如果JS被禁用,重定向到不同的页面。如果启用了JS,那么我会立即添加一个新项内联 - 这就像一个魅力。但是,如果禁用JS,我想重定向到另一个控制器的NEW页面。基本上模型设置如下:

Site -> Buildings -> Controllers (not to be confused with Rails "controllers")

我有一个“SiteManagerController”,它使用JS来管理整个事情。基本上我有一个场景,我正在尝试执行以下操作:

1)如果启用了JS,我想要内联添加项目 2)如果JS被禁用,我希望渲染“:controller => buildings,:action => new”

我的“link_to_remote”非常简单。正如我所说,它适用于JS。我的rails控制器代码如下:

def add_building     @building = Building.new     @ building.name =“无题”     @ building.site_id = params [:id]     @ building.save     respond_to do | format |       format.html {redirect_to:controller => “buildings”,:action => “新”}       format.js     结束   端

这不起作用。对于它的价值,当查看页面源时,没有迹象表明当启用JS与禁用时,任何内容都不同。所有链接看起来都一样 - 即Ajaxy。

我知道这不应该是一个复杂的问题,但我很难过。

最佳。

P.S。请不要更改这篇文章的标题。 ;)

3 个答案:

答案 0 :(得分:0)

我认为解决方案在于“link_to_remote”,而不是任何特定的控制器。以下似乎有效:

        <div><%=link_to_remote "NEW BUILDING", {:url => {:action => "add_building", :id => site.id}},
            {:href => url_for(:controller => "buildings",:action => "new")}%></div>

如果你们有更好的建议,请务必张贴。再次感谢。

答案 1 :(得分:0)

您是否尝试过编写表单以便重定向到另一个页面,然后在页面加载时使用ajax-y js覆盖了一些js?这样,如果禁用了js,页面将按预期重定向。

答案 2 :(得分:0)

提到的link_to_remote解决方案可能会有效,但是如果你正在寻找一种不引人注目的方法,你可以使用这样的一些javascript(jQuery):

你的.html.erb文件中的

<%=link_to "New Building", new_building_path, :id => 'new_building_link' %>

在javascript文件中:

$(document).load(function() {
  $("#new_building_link").click(function() {
    $.ajax({
      type:     "POST",  # or whatever http method you need
      url:      "/buildings/add_building",
      dataType: "script"
    });
    return false;
  });
});

然后返回一些JS,它将更新您想要更改的页面区域。

我确信有类似的方法可以使用Prototype,这是rails的默认JS库,但我不知道Prototype。

另请注意,这使用了restful路径(new_building_path而不是指定控制器和操作)。这是现在的首选方法;你只需要将“map.resources:buildings”添加到routes.rb即可。有一些关于宁静路线的Railscast,如果你有9美元掉线,那就是Peepcode。

正如上面提到的评论之一,您可以使用以下方法缩小构建创建代码:     Building.create({:name => "Untitled", :site_id => params[:id]})