在Ruby on Rails中执行远程(ajax)调用的正确方法

问题描述:

我正在用Ruby on Rails制作单页应用程序(这是我的第一个ruby项目,所以我肯定缺少很多东西)。 所以我有一个链接的侧面菜单和页面的右侧部分应该容纳一个容器,这意味着要填充部分页面的内容。 典型的菜单链接我现在看起来是这样的:在Ruby on Rails中执行远程(ajax)调用的正确方法

<%= link_to t('my-groups'), :controller => 'dashboard', :action => 'mygroups', :remote => true %> 

我有一个仪表盘控制器,这里是它的简化版本

class DashboardController < ApplicationController 
    def mygroups 
    respond_to do |format| 
     format.js 
    end 
    end 

我有它

容器DIV的仪表板模板 ​​

下面是它的routes.rb中路径:

get 'dashboard/mygroups' => 'dashboard#mygroups' 

我也有一个部分页面alogside我的仪表板模板,这就是所谓_mygroups.html.erb和被称为我的控制器动作 看结构的屏幕截图的JavaScript文件mygroups.js.erb enter image description here

这个js.erb文件的内容是:

$('.right_col').html("<%= escape_javascript(render(:partial => 'mygroups')) %>"); 

的所有作品,以及部分内容出现在链接点击就好了容器内。 但是仍然有2个问题我不能谷歌

该问题的部分答案:

1)它与Ajax调用,但如果我只是把这个http://localhost:3000/dashboard/mygroups到我的浏览器的导航线路和击中输入,它会给我这个错误

的ActionController :: UnknownFormat在DashboardController#mygroups 的ActionController :: UnknownFormat

Extracted source(around#70):

def mygroups respond_to do | format | format.js end end

我该如何避免这种情况,只是在这种情况下重定向到索引? 据我所知,ajax使用POST,但我试图使用后,而不是在此行动中获取routes.rb,它根本没有工作

2)如果我有很多行动对于不同的部分页面,我必须为每个操作创建一个新的js.erb文件吗?难道只用一个文件就可以以一种简单的方式完成它?

3)是否可以不明确指定控制器和此链接上的操作?

<%= link_to t('my-groups'), :controller => 'dashboard', :action => 'mygroups', :remote => true %> 

我的意思是,因为它应该是一个POST Ajax请求,为什么我需要像这样显示http://localhost:3000/dashboard/mygroups给用户的网址是什么?

+0

'.js.erb'是最麻烦的方法。取而代之的是使用JSON数据并在客户端脚本中包含函数,而不是作为响应提供。 – tadman

+0

add format.html也 – puneet18

+0

eg respond_to do | format | format.js format.html end – puneet18

在控制器像添加format.html:

class DashboardController < ApplicationController 
    def mygroups 
    if request.xhr? 
     respond_to do |format| 
     format.js 
     end 
    else 
     redirect_to root_url 
    end 
    end 

您可以在标签的link_to URL中添加类似:

<%= link_to t('my-groups'), '/dashboard/mygroups', :remote => true %> 
+0

format.html有哪些变化?我没有注意到任何变化。你能解释一下吗?至于'/仪表板/ mygroups',它没有任何区别。它仍然会创建一个链接,所以它不会回答我的问题 – Konstantin

+0

open url http:// localhost:3000/dashboard/mygroups,现在显示html页面 – puneet18

+0

DashboardController#mygroups缺少此请求格式和变体的模板。 request.formats:我不希望它打开页面。我需要这个请求被重定向到“/”,如果它不是用ajax – Konstantin

解答你问题

  1. 当你点击网址在浏览器中,它发送香草HTTP获取请求(非Ajax),您的控制器操作未配置为处理它。您需要添加format.html和名为groups.html.erb的模板,通常您会列出所有组,我想。

respond_to do |format| format.html format.js end

  1. 理想情况下,你必须创建单独的文件每个动作,但如果你可以把常用的东西了不同的动作,那么你可以将常用的模板代码一个部分并将其呈现在具有特殊功能的独立模板中或直接从控制器操作中呈现。

  2. 是的。 rails的方式是使用路由助手。运行rake routes列出您应用中的所有可用路由并查找相关帮助程序。

  3. 我强烈建议阅读导轨指南,了解如何工作。

开始=“2”>
+0

我一直在阅读文档。但是我无法一次全部阅读和理解,如果文档中有答案,我很抱歉,我找不到它。 – Konstantin