(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 => "Untitled", :site_id => 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?