我在使用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。请不要更改这篇文章的标题。 ;)
答案 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]})