(Ruby,Rails,Javascript)禁用Javascript时重定向/呈现不同的页面......?

Posted

技术标签:

【中文标题】(Ruby,Rails,Javascript)禁用Javascript时重定向/呈现不同的页面......?【英文标题】:(Ruby,Rails,Javascript) Redirecting/Rendering a different page when Javascript is disabled...? 【发布时间】:2010-11-04 11:14:49 【问题描述】:

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

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

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

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

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

def add_building @building = Building.new @building.name = "未命名" @building.site_id = 参数[:id] @building.save respond_to 做 |格式| format.html redirect_to :controller => "buildings", :action => "new" 格式.js 结尾 结束

这不起作用。值得一提的是,在查看页面源代码时,没有迹象表明启用 JS 和禁用 JS 有什么不同。所有链接看起来都一样——即 Ajaxy。

我知道这不应该是一个如此复杂的问题,但我很困惑。

最好的。

附:请不要更改这篇文章的标题。 ;)

【问题讨论】:

你可以将所有@building 的东西减少到Building.create(:name => "Untitled", :site_id => params[:id])。 :) 是的,那是试图尽可能冗长的结果。不过还是谢谢。 【参考方案1】:

上面提到的 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,会更新你想要改变的页面区域。

我确信在 Rails 的默认 JS 库 Prototype 上也有类似的方法,但我不知道 Prototype。

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

正如其中一位提到的 cmets,您可以使用以下方法缩减您的建筑创建代码: Building.create(:name =&gt; "Untitled", :site_id =&gt; params[:id])

【讨论】:

是的,基本上我试图尽可能地冗长(在短期内),同时保持以 RAILS 为中心(例如,使用包装器而不是显式的 JS 调用)。但我很喜欢你的建议。它确认解决方案在于链路而不是控制器。谢谢。 如果您希望它尽可能简单并且不介意突兀的 JS,那么正如第一个响应所暗示的那样,使用 link_to_remote 并指定一个 href 可能是您最好的选择。【参考方案2】:

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

【讨论】:

我不确定这是从正确的方向接近它。基本上想象一个网络“GUI”,您可以在其中添加和删除项目。如果启用了 JS,我只想单击添加链接并出现一个新的“空白”项目。但是,如果 JS 被禁用,我想被带到该项目的 NEW 页面。我在表单后去哪里与 atm 无关——尽管我最终希望重定向回原始页面。【参考方案3】:

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

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

如果你们有更好的建议,一定要发帖。再次感谢。

【讨论】:

以上是关于(Ruby,Rails,Javascript)禁用Javascript时重定向/呈现不同的页面......?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ruby on Rails 3.1 中禁用资产管道(链轮)消息的日志记录?

单击时禁用引导表行并将其保存在 Ruby on Rails 中

Ruby on Rails:RSpec 和 Acts As Audited(在测试时禁用acts_as_audited?)

如何在 ruby​​ on rails 中访问 rails 助手和嵌入资产 javascript 文件中的 ruby​​?

Rails 3:将字符串从 Ruby 传递到 Javascript?

如何在 Rails 视图中将 Ruby 变量传递给 JavaScript 函数?